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. <WP8开发学习笔记>动态修改启动时导航的第一个页面(如登录前启动页为LoginPage,登录后变为MainPage)

    很多时候我们需要在启动程序的时候根据状态改变初始导航页面,比如程序在启动的时候判断用户是否登录, 如果未登录则跳转到LoginPage.xaml否则跳转到MainPage界面. 这时候就要分析程序的启 ...

  2. @hdu - 5822@ color

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个每个点出度都为 1 的有向连通图以及 m 种颜色.求本质 ...

  3. Chosen by god【组合数打表】

    Chosen by god 题目链接(点击) Everyone knows there is a computer game names "hearth stone", recen ...

  4. C#数据结构与算法系列(三):队列

    1.介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则,即:先存入队列的数据,要先取出.后存入的要后取出 队列是属于线性结构中的一种 2.图示  3.通过数组实现 public ...

  5. FastReport分组与聚合

    本来看上去都觉得简单顺便训练下,是想对Customer表中的Company字段以第1个开头的字母分组,结果自己因喜欢将那些东西都集中在一起进行训练,在那个Master-Slave上做例子,并且没用另外 ...

  6. [搬运]Intellij IDEA 汉化

    Github地址: https://github.com/pingfangx/TranslatorX

  7. Java XML文件解析

    四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例) 蓝色字体内容由上一篇博文中补充进来的,写作风格比较好,大家有兴趣可以去查看原文 众所周知,现在解析XML的方法越来越多,但主流的方法也就四 ...

  8. 04[掌握] Java连接redis操作

    1,Jedis所需要的jar包依赖 <dependency> <groupId>redis.clients</groupId> <artifactId> ...

  9. 计算机网络之tcp四次挥手

    TCP的四次挥手(Four-Way Wavehand)1.前言对于"三次握手"我们耳熟能详,因为其相对的简单.但是,我们却不常听见“四次挥手”,就算听过也未必能详细地说明白它的具体 ...

  10. vim/vm命令后提示错误:Found a swap file by the name ".dockerfile.swp"

    今天在使用docker时,使用vim命令操作dockerfile文件,提示如下错误: 错误原因,是由于上一次在操作该文件时,异常退出,然后系统生成了一个dockerfile.swp文件,该文件是个隐藏 ...