PythonWEB框架之Flask

Posted 他人能者亦能,他人不能者吾亦能

tags:

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

0.Flask简介

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

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

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

 

python中的框架:

Django:1个重武器,包含了web开发中常用的功能、组件的框架;(ORM、Session、Form、Admin、分页、中间件、信号、缓存、ContenType....);

Tornado:2大特性就是异步非阻塞、原生支持WebSocket协议;

Flask:封装功能不及Django完善,性能不及Tornado,但是Flask的第三方开源组件比丰富;http://flask.pocoo.org/extensions/

Bottle:比较简单;

1.安装

pip3 install flask

 

2.werkzeug简介

Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等

代码示例:

from werkzeug.wrappers import Request, Response

@Request.application
def hello(request):
    return Response(Hello World!)

if __name__ == __main__:
    from werkzeug.serving import run_simple
    run_simple(localhost, 4000, hello)

3.flask快速使用

from flask import Flask
# 实例化产生一个Flask对象
app = Flask(__name__)
# 将 ‘/‘和视图函数hello_workd的对应关系添加到路由中
@app.route(/) # 1. v=app.route(‘/‘) 2. v(hello_world)
def hello_world():
    return Hello World!

if __name__ == __main__:
    app.run() # 最终调用了run_simple()

案例:登录,显示用户信息

main.py

from flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)
app.debug = True
app.secret_key = sdfsdfsdfsdf

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

@app.route(/detail/<int:nid>,methods=[GET])
def detail(nid):
    user = session.get(user_info)
    if not user:
        return redirect(/login)

    info = USERS.get(nid)
    return render_template(detail.html,info=info)


@app.route(/index,methods=[GET])
def index():
    user = session.get(user_info)
    if not user:
        # return redirect(‘/login‘)
        url = url_for(l1)
        return redirect(url)
    return render_template(index.html,user_dict=USERS)


@app.route(/login,methods=[GET,POST],endpoint=l1)
def login():
    if request.method == "GET":
        return render_template(login.html)
    else:
        # request.query_string
        user = request.form.get(user)
        pwd = request.form.get(pwd)
        if user == lqz and pwd == 123:
            session[user_info] = user
            return redirect(http://www.baidu.com)
        return render_template(login.html,error=用户名或密码错误)

if __name__ == __main__:
    app.run()

detail.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>详细信息 {{info.name}}</h1>
    <div>
        {{info.text}}
    </div>
</body>
</html>

 

index.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户列表</h1>
    <table>
        {% for k,v in user_dict.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="user">
        <input type="text" name="pwd">
        <input type="submit" value="登录">{{error}}
    </form>
</body>
</html>

登录认证装饰器

from functools import wraps
def login_auth(func):
    @wraps(func)
    def inner(*args,**kwargs):
        user=session.get(user)
        if user:
            res=func(*args,**kwargs)
            return res
        else:
            return redirect(/login)
    return inner

还有一种方式,在每一个方法上方的@app后endpoint=‘‘别名

4.配置文件

flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为:`

{
        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,
    }

方式一:

app.config[‘DEBUG‘] = True

 

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

师傅带徒弟学:Python Web之Flask框架-关东升-专题视频课程

Flask 与 Django 先学哪个呢

1 Flask 和pythonweb框架介绍2 flask快速使用 3 登录,显示用户信息小案例4 配置文件方式 5 路由系统

轻量级NoSQL数据库与PythonWeb-Flask框架组合使用2-Flask框架介绍

Flask框架从入门到精通之初识

轻量级NoSQL数据库与PythonWeb-Flask框架组合使用3-Flask框架安装