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. 有a1,a2,a3,a4,四个数组,四个数组重新组合成一个数组(A),间隔是10个元素

    好久没折腾Py了,这是去年年初2019.3月发在Q中的一个记录,因不从事这个,并且被在工厂耽误10几年,所以很少写Blog在这里,感觉这里比较正式,而在Q中只是随意性的记载, 但发布图片总是需要另外再 ...

  2. Quartz.Net系列(二):介绍、简单使用、对比Windows计划任务

    1.介绍 Quartz是功能强大的开源作业调度库,几乎可以集成到任何Java应用程序中-从最小的独立应用程序到最大的电子商务系统.Quartz可用于创建简单或复杂的计划,以执行数以万计,数以万计的工作 ...

  3. belongsTo和hasOne的区别

    简单的讲就是,没有太大的区别,只是在逻辑上出现的思想的偏差(逻辑的合理性).belongsTo:可以理解为属于hasOne:可以理解为拥有 首先,我们创建两张表.user表 字段 id name pa ...

  4. position两种绝对定位的区别

    position绝对定有两种,分别为absolute和fixed 一.共同点: 1.改变行内元素的呈现方式,display被置为inline:block 2.让元素脱离普通流,不占据空间 3.默认会覆 ...

  5. 记录工作中遇到的BUG,经典的数据库时区问题和字段类型tinyint(1)问题

    记录工作中发现的相对而言经典的问题 [数据库时区问题] 我个人数据库配置为CST 如下 我们测试环境的数据库配置为UTC 如下 倘若我修改了测试环境数据库时区为CST.由此造成的问题是 系统读取到数据 ...

  6. Windows7/10实现ICMP(ping命令)

    如果觉得本文如果帮到你或者你想转载都可以,只需要标注出处即可.谢谢 利用ICMP数据包.C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试—个主机到只一个主机之间 ...

  7. Python3-算法-冒泡排序

    冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成,这个算法的名字由来是因为越大的元素 ...

  8. 入门大数据---Spark_Structured API的基本使用

    一.创建DataFrame和Dataset 1.1 创建DataFrame Spark 中所有功能的入口点是 SparkSession,可以使用 SparkSession.builder() 创建.创 ...

  9. Python实用笔记 (2)list和tuple

    list 这就是一个列表: classmates = ['Michael', 'Bob', 'Tracy'] //内部数据类型可以不同 同样len()函数可以获取长度: len(classmates) ...

  10. codeforce 796C - Bank Hacking(无根树+思维)

    题目 Although Inzane successfully found his beloved bone, Zane, his owner, has yet to return. To searc ...