02 flask快速使用

1.flask与django的区别

  1. django是个大而全的框架,flask是一个轻量级的框架。

  2. django内部为我们提供了非常多的组件:orm / session / cookie / admin / form / modelform / 路由 / 视图 / 模板 / 中间件 / 分页 / auth / contenttype / 缓存 / 信号 / 多数据库连接 ;

    flask框架本身没有太多的功能:路由/视图/模板(jinja2)/session/中间件 ,第三方组件非常齐全。

  3. django的请求处理是逐一封装和传递; flask的请求是利用上下文管理来实现的。

2. 安装

pip3 install flask

3. 依赖wsgi Werkzeug

from werkzeug.serving import run_simple

def func(environ, start_response):
print('请求来了')
pass if __name__ == '__main__':
run_simple('127.0.0.1', 5000, func)
from werkzeug.serving import run_simple

class Flask(object):

    def __call__(self,environ, start_response):
return "xx"
app = Flask() if __name__ == '__main__':
run_simple('127.0.0.1', 5000, app)
from werkzeug.serving import run_simple

class Flask(object):

    def __call__(self,environ, start_response):
return "xx" def run(self):
run_simple('127.0.0.1', 5000, self) app = Flask() if __name__ == '__main__':
app.run()

4. 快速使用flask

from flask import Flask

# 创建flask对象
app = Flask(__name__) @app.route('/index')
def index():
return 'hello world' @app.route('/login')
def login():
return 'login' if __name__ == '__main__':
app.run()

总结:

  • flask框架是基于werkzeug的wsgi实现,flask自己没有wsgi。
  • 用户请求一旦到来,就会执行 app.__call__ 方法 。
  • 写flask标准流程

5. 用户登录&用户管理

from flask import Flask, render_template, jsonify,request,redirect,url_for

app = Flask(__name__)

DATA_DICT = {
1: {'name':'张三',"age":73},
2: {'name':'李四',"age":84},
} @app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'GET':
# return '登录' # HttpResponse
# return render_template('login.html') # render
# return jsonify({'code':1000,'data':[1,2,3]}) # JsonResponse
return render_template('login.html')
user = request.form.get('user')
pwd = request.form.get('pwd')
if user == '张三' and pwd == "123":
return redirect('/index')
error = '用户名或密码错误'
# return render_template('login.html',**{'error':error})
return render_template('login.html',error=error) @app.route('/index',endpoint='idx')
def index():
data_dict = DATA_DICT
return render_template('index.html',data_dict=data_dict) @app.route('/edit',methods=['GET','POST'])
def edit():
nid = request.args.get('nid')
nid = int(nid) if request.method == "GET":
info = DATA_DICT[nid]
return render_template('edit.html',info=info) user = request.form.get('user')
age = request.form.get('age')
DATA_DICT[nid]['name'] = user
DATA_DICT[nid]['age'] = age
return redirect(url_for('idx')) @app.route('/del/<int:nid>')
def delete(nid):
del DATA_DICT[nid]
# return redirect('/index')
return redirect(url_for("idx")) if __name__ == '__main__':
app.run()

总结

  1. flask路由

    @app.route('/login',methods=['GET','POST'])
    def login():
    pass
  2. 路由的参数

    @app.route('/login',methods=['GET','POST'],endpoint="login")
    def login():
    pass # 注意:endpoint不能重名
  3. 动态路由

    @app.route('/index')
    def login():
    pass @app.route('/index/<name>')
    def login(name):
    pass @app.route('/index/<int:nid>')
    def login(nid):
    pass
  4. 获取提交的数据

    from flask import request
    
    @app.route('/index')
    def login():
    request.args # GET形式传递的参数
    request.form # POST形式提交的参数
  5. 返回数据

    @app.route('/index')
    def login():
    return render_template('模板文件')
    return jsonify()
    reutrn redirect('/index/') # reutrn redirect(url_for('idx'))
    return "...."
  6. 模板处理

    {{ x }}
    {% for item in list %}
    {{item}}
    {% endfor %}

6.保存用户会话信息

  1. 代码示例

    import functools
    from flask import Flask, render_template, jsonify,request,redirect,url_for,session app = Flask(__name__) app.secret_key = 'uo3kj9sd78ij3l4kj9sd87fj' DATA_DICT = {
    1: {'name':'张三',"age":73},
    2: {'name':'李四',"age":84},
    } def auth(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
    username = session.get('xxx')
    if not username:
    return redirect(url_for('login'))
    return func(*args,**kwargs)
    return inner @app.route('/login',methods=['GET','POST'])
    def login():
    if request.method == 'GET':
    return render_template('login.html')
    user = request.form.get('user')
    pwd = request.form.get('pwd')
    if user == 'changxin' and pwd == "dsb":
    session['xxx'] = 'zhangsan'
    return redirect('/index')
    error = '用户名或密码错误'
    return render_template('login.html',error=error) @app.route('/index',endpoint='idx')
    @auth
    def index():
    data_dict = DATA_DICT
    return render_template('index.html',data_dict=data_dict)
  2. 保存用户会话信息总结

    • flask的session是放在用户的浏览器的,服务端不存储,是将用户的session值通过secret_key加密后返回给浏览器,存储在cookie中,下次请求过来时flask将该段密文进行解密
    • flask的session必须依赖secret_key
    • 如果用装饰器保留会话信息的话,必须要在装饰器加@functools.wraps,保留元数据,否则每个被装饰的函数都是相同的别名(endpoint),会报错
    • @auth装饰器放在@app.route的下边,请求过来应该先执行auth函数判断是否已经登录

7. 蓝图(blue print)

  1. 构建业务功能可拆分的目录结构。

    • pro_excel

      • pro_excel

        • static
        • templates
        • views
          • wy.py
          • my.py
        • __init__.py
      • manage.py
  2. 创建蓝图

    __init__.py

    from flask import Flask
    from .views.my import xmy
    from .views.wy import xwy def create_app():
    app = Flask(__name__)
    app.secret_key = 'asdfaskdfjsd' @app.route('/index')
    def index():
    return 'index' app.register_blueprint(xmy)
    app.register_blueprint(xwy) return app

    wy.py

    from flask import Blueprint
    
    xwy = Blueprint('wy', __name__)
    
    @xwy.route('/f3')
    def f1():
    return '我是wy'

    my.py

    from flask import Blueprint
    
    xmy = Blueprint('my',__name__)
    
    @xmy.route('/f1')
    def f1():
    return '我是my'

    manage.py

    from pro_excel import create_app
    
    app = create_app()
    
    if __name__ == '__main__':
    app.run()
  3. 蓝图总结

    • 创建蓝图的函数名create_app不能修改,flask第三方组件特别多,有利于以后用flask用第三方组件
    • flask中的蓝图和django中路由分发差不多

02 flask源码剖析之flask快速使用的更多相关文章

  1. 08 Flask源码剖析之flask拓展点

    08 Flask源码剖析之flask拓展点 1. 信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 2. 根据flas ...

  2. flask源码剖析系列(系列目录)

    flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...

  3. 02 drf源码剖析之快速了解drf

    02 drf源码剖析之快速了解drf 目录 02 drf源码剖析之快速了解drf 1. 什么是drf 2. 安装 3. 使用 3. DRF的应用场景 1. 什么是drf drf是一个基于django开 ...

  4. flask 源码剖析

    flask 上下文管理源码流程及涉及的部分技术点 [flask源码梳理]之一  偏函数_mro [flask源码梳理]之二  面向对象中__setattr__ [flask源码梳理]之三  Local ...

  5. Flask源码剖析详解

    1. 前言 本文将基于flask 0.1版本(git checkout 8605cc3)来分析flask的实现,试图理清flask中的一些概念,加深读者对flask的理解,提高对flask的认识.从而 ...

  6. 04 flask源码剖析之LocalStack和Local对象实现栈的管理

    04 LocalStack和Local对象实现栈的管理 目录 04 LocalStack和Local对象实现栈的管理 1.源码入口 1. flask源码关于local的实现 2. flask源码关于l ...

  7. 05 flask源码剖析之配置加载

    05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...

  8. 06 flask源码剖析之路由加载

    06 Flask源码之:路由加载 目录 06 Flask源码之:路由加载 1.示例代码 2.路由加载源码分析 1.示例代码 from flask import Flask app = Flask(__ ...

  9. 07 flask源码剖析之用户请求过来流程

    07 Flask源码之:用户请求过来流程 目录 07 Flask源码之:用户请求过来流程 1.创建ctx = RequestContext对象 2. 创建app_ctx = AppContext对象 ...

随机推荐

  1. Bash知识点记录

    变量的设置规则   1.  等号两边不能直接接空格符.   2. 右侧的变量内容若有空格符,可使用双引号或单引号将变量内容括起来,其中, 双引号内的特殊字符如 $ 等,可以保有原本的特性.如下所示: ...

  2. 「雅礼集训 2017 Day4」洗衣服

    题目   点这里看题目. 分析   首先考虑只有洗衣机的情况.我们可以想到,当前洗衣任务结束越早的洗衣机应该被先用,因此可以用堆来动态维护.   再考虑有烘干机的情况.很显然,越晚洗完的衣服应该越早烘 ...

  3. 用 Explain 命令分析 MySQL 的 SQL 执行

    在上一篇文章<MySQL常见加锁场景分析>中,我们聊到行锁是加在索引上的,但是复杂的 SQL 往往包含多个条件,涉及多个索引,找出 SQL 执行时使用了哪些索引对分析加锁场景至关重要. 比 ...

  4. 虹软AI 人脸识别SDK接入 — 参数优化篇

    引言 使用了免费的人脸识别算法,感觉还是很不错的,但是初次接触的话会对一些接口的参数有些疑问的.这里分享一下我对一些参数的验证结果(这里以windows版本为例,linux.android基本一样), ...

  5. tomcat中AJP协议和HTTP协议的区别

    tomcat的server.xml中的AJP和HTTP连接器区别 HTTP协议:连接器监听8080端口,负责建立HTTP连接.在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器. ...

  6. Skywalking的存储配置与调优

    https://blog.csdn.net/smooth00/article/details/96479544 作为一款APM和全链路监控平台,Skywalking算是挺出色的.Skywalking是 ...

  7. Springboot在包含有参构造方法的类中使用@Value注解取值

    我们在Springboot中经常使用@Value注解来获取配置文件中的值,像下面这样 @Component class A { @Value("${user.value}") pr ...

  8. 编译ts时候src目录的ts分别生成了单独的js文件

    { "compilerOptions": { "target": "es5", "outDir": "bin- ...

  9. 逻辑式编程语言极简实现(使用C#) - 2. 一道逻辑题:谁是凶手

    本系列前面的文章: 逻辑式编程语言极简实现(使用C#) - 1. 逻辑式编程语言介绍 这是一道Prolog经典的练习题,中文翻译版来自阮一峰的文章<Prolog 语言入门教程>. 问题 B ...

  10. JavaScript常用API合集汇总(一)

    今天这篇文章跟大家分享一些JavaScript常用的API代码,有DOM操作.CSS操作.对象(Object对象.Array对象.Number对象.String对象.Math对象.JSON对象和Con ...