Flask

Posted pdun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask相关的知识,希望对你有一定的参考价值。

一、Flask了解

技术图片
    #flask是一个基于python开发并且依赖jinja2和Werkzeug服务的微型框架
    对于werkzeug本质是socket服务端,其用于接收http请求并对请求进行预处理,然后触发flask框架,开发人员基于flask框架提供的功能对请求进行相应的处理,并返回给客户,如果返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户的浏览器

    “微(micro)”并不代表你需要把整个web应用塞进单个python文件(虽然确实可以),也不意味着flask在功能上有所欠缺,微框架中的“微"意味着flask旨在保持核心简单而易于扩展,Flask 不会替你做出太多决策——比如使用何种数据库。而那些  Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。


    默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask  支持用扩展来给应用添加这些功能,如同是 Flask  本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask  也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用
View Code

1、安装

pip3 install flask

2、werkzeug简介

安装flask后自动就有werkzeug
Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等 
技术图片
from werkzeug.wrappers import Response,Request

@Request.application
def hello(request):       #wsgi协议需要两个参数,env和response,这里只有一个参数,不符合该协议,     #werkzeug是个工具包,在wsgi基础上又做了封装,所以传一个参数就行
 
   def hello(request):   
        return Response(Hello World!)

    if __name__ == __main__:
        from werkzeug.serving import run_simple
        run_simple(localhost, 4000, hello)   #三个参数分别是跑的地址,跑的端口,最后一个是可调用对象
werkzeug

3、对比django

#对应django中的三件套

Httprespose        ‘‘
render                 render_template
redirect               redirect
JsonResponse       jsonify

 

 

二、flask的使用

1、flask最简单的模板

from flask import Flask
# 实例化产生一个Flask对象
app = Flask(__name__)

#flask的路由是基于装饰器的
@app.route(/) 
def hello_world():
    return Hello World!

if __name__ == __main__:
    app.run()      # 看源码发现,最终调用了werkzeug的run_simple()

 

 

2、flask登陆

技术图片
from flask import Flask, request, render_template, redirect

app = Flask(__name__)
USERS = 
    1: name: 张三, age: 18, gender: , text: "道路千万条",
    2: name: 李四, age: 28, gender: , text: "安全第一条",
    3: name: 王五, age: 18, gender: , text: "行车不规范",



#methods=[‘GET‘,‘POST‘] 该路由运行get请求和post请求,没写默认只允许get请求
@app.route(/login, methods=[GET, POST])
def login():
    if request.method == GET:

# html文件放在templates(自己创建的)中,实例化的过程中app=Flask(__name__),点Flask进去,看到template_folder="templates",

        return render_template(login.html)
    else:  # request.form相当于django中的POST,注意不是from.是form
        name = request.form.get(name)
        pwd = request.form.get(pwd)
        if name == pdun and pwd == 123:
            return redirect(/)
        else:  # django中传字典,这里传字典打散,**字典
            return render_template(login.html, error="用户名或密码错误")


@app.route(/)
def index():
    return render_template(index.html, user=USERS)


@app.route(/detail/<int:id>)
def detail(id):
    user = USERS[id]
    return render_template(detail.html, user=user)


if __name__ == __main__:
    app.run()
View Code

需要的HTML

技术图片
#detail.HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>详细信息 user.name</h1>
    <div>
        user.text
    </div>
</body>
</html>


#index.HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table>
        % for k,v in user.items() %
        <tr>
            <td>k</td>            #三种取值方式
            <td>v.name</td>
            <td>v[name]</td>
            <td>v.get(name)</td>
            <td><a href="/detail/k">查看详细</a></td>
        </tr>
        % endfor %
    </table>
</body>
</html>





#login.HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post">
        <input type="text" name="name">
        <input type="text" name="pwd">
        <input type="submit" value="登录">error
    </form>
</body>
</html>
3个HEML都在这

 

 

3、配置文件

技术图片
#方式一
      app.config[DEBUG] = True
   PS: 由于Config对象本质上是字典,所以还可以使用app.config.update(...)
#不常用的几种方法
#1、通过py文件配置
    app.config.from_pyfile("python文件名称")
    如:
    settings.py
    DEBUG = True

2、app.config.from_pyfile("settings.py")
    #通过环境变量配置
    app.config.from_envvar("环境变量名称")
    #app.config.from_pyfile(os.environ[‘YOURAPPLICATION_SETTINGS‘])
    环境变量的值为python文件名称名称,内部调用from_pyfile方法

3、app.config.from_json("json文件名称")
    JSON文件名称,必须是json格式,因为内部会执行json.loads

4、app.config.from_mapping(DEBUG: True)
    字典格式


#settings.py文件默认路径要放在程序根目录,如果想更改
需要修改源码实例化过程中的最后两个参数,
instance_relative_config=True,
root_path=#setting文件的位置
View Code

 

#常用方式
app.config.from_object("python类或类的路径")
app.config.from_object(pro_flask.settings.TestingConfig)

#settings.py
class Config(object):
    DEBUG = False
    TESTING = False
    DATABASE_URI = sqlite://:memory:


class ProductionConfig(Config):
    DATABASE_URI = mysql://[email protected]/foo


class DevelopmentConfig(Config):
    DEBUG = True


class TestingConfig(Config):
    TESTING = True



#settings.py文件默认路径要放在程序根目录,如果想更改
需要修改源码实例化过程中的最后两个参数,
instance_relative_config=True,
root_path=#setting文件的位置

 

技术图片

        DEBUG:                                get_debug_flag(default=False),  是否开启Debug模式
        TESTING:                              False,                          是否开启测试模式
        PROPAGATE_EXCEPTIONS:                 None,                          
        PRESERVE_CONTEXT_ON_EXCEPTION:        None,
        SECRET_KEY:                           None,
        PERMANENT_SESSION_LIFETIME:           timedelta(days=31),
        USE_X_SENDFILE:                       False,
        LOGGER_NAME:                          None,
        LOGGER_HANDLER_POLICY:               always,
        SERVER_NAME:                          None,
        APPLICATION_ROOT:                     None,
        SESSION_COOKIE_NAME:                  session,
        SESSION_COOKIE_DOMAIN:                None,
        SESSION_COOKIE_PATH:                  None,
        SESSION_COOKIE_HTTPONLY:              True,
        SESSION_COOKIE_SECURE:                False,
        SESSION_REFRESH_EACH_REQUEST:         True,
        MAX_CONTENT_LENGTH:                   None,
        SEND_FILE_MAX_AGE_DEFAULT:            timedelta(hours=12),
        TRAP_BAD_REQUEST_ERRORS:              False,
        TRAP_HTTP_EXCEPTIONS:                 False,
        EXPLAIN_TEMPLATE_LOADING:             False,
        PREFERRED_URL_SCHEME:                 http,
        JSON_AS_ASCII:                        True,
        JSON_SORT_KEYS:                       True,
        JSONIFY_PRETTYPRINT_REGULAR:          True,
        JSONIFY_MIMETYPE:                     application/json,
        TEMPLATES_AUTO_RELOAD:                None,
    
默认配置

 

 

4、路由系统

典型写法

@app.route(/detail/<int:nid>,methods=[GET],endpoint=detail)
#<int:nid>转换器
#methods=[‘GET‘]该路由允许的请求方式
#endpoint=‘detail‘   起别名,反向解析时用

默认转换器

DEFAULT_CONVERTERS = 
    default:          UnicodeConverter,
    string:           UnicodeConverter,      #常用
    any:              AnyConverter,
    path:             PathConverter,
    int:              IntegerConverter,      #常用
    float:            FloatConverter,
    uuid:             UUIDConverter,

路由的本质

技术图片
1. decorator = app.route(/,methods=[GET,POST],endpoint=n1)
    def route(self, rule, **options):
        # app对象
        # rule= /
        # options = methods=[‘GET‘,‘POST‘],endpoint=‘n1‘
        def decorator(f):
            endpoint = options.pop(endpoint, None)
            self.add_url_rule(rule, endpoint, f, **options)
            return f
        return decorator
2. @decorator
    decorator(index)
"""
#同理
def login():
    return ‘登录‘
app.add_url_rule(‘/login‘, ‘n2‘, login, methods=[‘GET‘,"POST"])
#与django路由类似
#django与flask路由:flask路由基于装饰器,本质是基于:add_url_rule
#add_url_rule 源码中,endpoint如果为空,endpoint = _endpoint_from_view_func(view_func),最终取view_func.__name__(函数名)
View Code

 

以上是关于Flask的主要内容,如果未能解决你的问题,请参考以下文章

FlaskFlask特有的变量和函数

FlaskFlask与RESTful开发相关API

Flaskflask+uwsgi+nginx环境部署

FlaskFlask Cookie操作

FlaskFlask框架使用中异常捕获

FlaskFlask与SMTP协议邮件扩展