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. 解决Maven静态资源过滤问题

    在项目的pom.xml中添加下面的内容 <build> <resources> <resource> <directory>src/main/java& ...

  2. Dart Memo for Android Developers

    Dart Memo for Android Developers Dart语言一些语法特点和编程规范. 本文适合: 日常使用Kotlin, 突然想写个Flutter程序的Android程序员. Dar ...

  3. mysql索引小总结

    MySql 1.索引 mysql索引默认使用的是B+Tree(B-树的变种版).也可以使用HASH表. 二叉树: 二叉树又称二叉搜索树,二叉排序树,特点如下: 左子树上所有结点值均小于根结点 右子树上 ...

  4. Asp.Net Core入门之自定义中间件

    什么是中间件? 这里引用官方解释: 中间件是用于组成应用程序管道来处理请求和响应的组件.管道内的每一个组件都可以选择是否将请求交给下一个组件.并在管道中调用下一个组件之前和之后执行某些操作.请求委托被 ...

  5. Module Error (from ./node_modules/eslint-loader/index.js):解决办法

    vue启动项目报如下错误: Failed to compile. ./src/components/Vcontent.vue Module Error (from ./node_modules/esl ...

  6. Java WebService _CXF、Xfire、AXIS2、AXIS1_四种发布方式(优缺点对比)

    xis,axis2,Xfire以及cxf对比 http://ws.apache.org/axis/ http://axis.apache.org/axis2/java/core/ http://xfi ...

  7. java android 序列号serializable和parcelable

    why 为什么要了解序列化?—— 进行Android开发的时候,无法将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递. ...

  8. 阿里巴巴--java多线程的两种实现方式,以及二者的区别

    阿里巴巴面试的时候,昨天问了我java面试的时候实现java多线程的两种方式,以及二者的区别当时只回答了实现线程的两种方式,但是没有回答上二者的区别: java实现多线程有两种方式: 1.继承Thre ...

  9. Java 多线程基础(十一)线程优先级和守护线程

    Java 多线程基础(十一)线程优先级和守护线程 一.线程优先级 Java 提供了一个线程调度器来监控程序启动后进去就绪状态的所有线程.线程调度器通过线程的优先级来决定调度哪些线程执行.一般来说,Ja ...

  10. Spring IoC component-scan 节点详解

    前言 我们在了解 Spring 容器的扩展功能 (ApplicationContext) 之前,先介绍下 context:component-scan 标签的解析过程,其作用很大是注解能生效的关键所在 ...