02 flask源码剖析之flask快速使用
02 flask快速使用
1.flask与django的区别
django是个大而全的框架,flask是一个轻量级的框架。
django内部为我们提供了非常多的组件:orm / session / cookie / admin / form / modelform / 路由 / 视图 / 模板 / 中间件 / 分页 / auth / contenttype / 缓存 / 信号 / 多数据库连接 ;
flask框架本身没有太多的功能:路由/视图/模板(jinja2)/session/中间件 ,第三方组件非常齐全。
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()
总结
flask路由
@app.route('/login',methods=['GET','POST'])
def login():
pass
路由的参数
@app.route('/login',methods=['GET','POST'],endpoint="login")
def login():
pass # 注意:endpoint不能重名
动态路由
@app.route('/index')
def login():
pass @app.route('/index/<name>')
def login(name):
pass @app.route('/index/<int:nid>')
def login(nid):
pass
获取提交的数据
from flask import request @app.route('/index')
def login():
request.args # GET形式传递的参数
request.form # POST形式提交的参数
返回数据
@app.route('/index')
def login():
return render_template('模板文件')
return jsonify()
reutrn redirect('/index/') # reutrn redirect(url_for('idx'))
return "...."
模板处理
{{ x }}
{% for item in list %}
{{item}}
{% endfor %}
6.保存用户会话信息
代码示例
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)
保存用户会话信息总结
- flask的session是放在用户的浏览器的,服务端不存储,是将用户的session值通过secret_key加密后返回给浏览器,存储在cookie中,下次请求过来时flask将该段密文进行解密
- flask的session必须依赖secret_key
- 如果用装饰器保留会话信息的话,必须要在装饰器加@functools.wraps,保留元数据,否则每个被装饰的函数都是相同的别名(endpoint),会报错
- @auth装饰器放在@app.route的下边,请求过来应该先执行auth函数判断是否已经登录
7. 蓝图(blue print)
构建业务功能可拆分的目录结构。
- pro_excel
pro_excel
static
templates
views
wy.py
my.py
__init__.py
manage.py
- pro_excel
创建蓝图
__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()蓝图总结
- 创建蓝图的函数名create_app不能修改,flask第三方组件特别多,有利于以后用flask用第三方组件
- flask中的蓝图和django中路由分发差不多
02 flask源码剖析之flask快速使用的更多相关文章
- 08 Flask源码剖析之flask拓展点
08 Flask源码剖析之flask拓展点 1. 信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 2. 根据flas ...
- flask源码剖析系列(系列目录)
flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...
- 02 drf源码剖析之快速了解drf
02 drf源码剖析之快速了解drf 目录 02 drf源码剖析之快速了解drf 1. 什么是drf 2. 安装 3. 使用 3. DRF的应用场景 1. 什么是drf drf是一个基于django开 ...
- flask 源码剖析
flask 上下文管理源码流程及涉及的部分技术点 [flask源码梳理]之一 偏函数_mro [flask源码梳理]之二 面向对象中__setattr__ [flask源码梳理]之三 Local ...
- Flask源码剖析详解
1. 前言 本文将基于flask 0.1版本(git checkout 8605cc3)来分析flask的实现,试图理清flask中的一些概念,加深读者对flask的理解,提高对flask的认识.从而 ...
- 04 flask源码剖析之LocalStack和Local对象实现栈的管理
04 LocalStack和Local对象实现栈的管理 目录 04 LocalStack和Local对象实现栈的管理 1.源码入口 1. flask源码关于local的实现 2. flask源码关于l ...
- 05 flask源码剖析之配置加载
05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...
- 06 flask源码剖析之路由加载
06 Flask源码之:路由加载 目录 06 Flask源码之:路由加载 1.示例代码 2.路由加载源码分析 1.示例代码 from flask import Flask app = Flask(__ ...
- 07 flask源码剖析之用户请求过来流程
07 Flask源码之:用户请求过来流程 目录 07 Flask源码之:用户请求过来流程 1.创建ctx = RequestContext对象 2. 创建app_ctx = AppContext对象 ...
随机推荐
- 有a1,a2,a3,a4,四个数组,四个数组重新组合成一个数组(A),间隔是10个元素
好久没折腾Py了,这是去年年初2019.3月发在Q中的一个记录,因不从事这个,并且被在工厂耽误10几年,所以很少写Blog在这里,感觉这里比较正式,而在Q中只是随意性的记载, 但发布图片总是需要另外再 ...
- Quartz.Net系列(二):介绍、简单使用、对比Windows计划任务
1.介绍 Quartz是功能强大的开源作业调度库,几乎可以集成到任何Java应用程序中-从最小的独立应用程序到最大的电子商务系统.Quartz可用于创建简单或复杂的计划,以执行数以万计,数以万计的工作 ...
- belongsTo和hasOne的区别
简单的讲就是,没有太大的区别,只是在逻辑上出现的思想的偏差(逻辑的合理性).belongsTo:可以理解为属于hasOne:可以理解为拥有 首先,我们创建两张表.user表 字段 id name pa ...
- position两种绝对定位的区别
position绝对定有两种,分别为absolute和fixed 一.共同点: 1.改变行内元素的呈现方式,display被置为inline:block 2.让元素脱离普通流,不占据空间 3.默认会覆 ...
- 记录工作中遇到的BUG,经典的数据库时区问题和字段类型tinyint(1)问题
记录工作中发现的相对而言经典的问题 [数据库时区问题] 我个人数据库配置为CST 如下 我们测试环境的数据库配置为UTC 如下 倘若我修改了测试环境数据库时区为CST.由此造成的问题是 系统读取到数据 ...
- Windows7/10实现ICMP(ping命令)
如果觉得本文如果帮到你或者你想转载都可以,只需要标注出处即可.谢谢 利用ICMP数据包.C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试—个主机到只一个主机之间 ...
- Python3-算法-冒泡排序
冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成,这个算法的名字由来是因为越大的元素 ...
- 入门大数据---Spark_Structured API的基本使用
一.创建DataFrame和Dataset 1.1 创建DataFrame Spark 中所有功能的入口点是 SparkSession,可以使用 SparkSession.builder() 创建.创 ...
- Python实用笔记 (2)list和tuple
list 这就是一个列表: classmates = ['Michael', 'Bob', 'Tracy'] //内部数据类型可以不同 同样len()函数可以获取长度: len(classmates) ...
- codeforce 796C - Bank Hacking(无根树+思维)
题目 Although Inzane successfully found his beloved bone, Zane, his owner, has yet to return. To searc ...