Flask详解(中篇)
一 Flask请求和响应
from flask import Flask from flask import request from flask import render_template from flask import redirect from flask import make_responseapp = Flask(__name__)@app.route('/login.html', methods=['GET', "POST"]) def login():
请求相关信息
# request.method # request.args 获取GET方式的url参数 # request.form form提交的数据取值 # request.values 同时获得form和args的值 # request.json 请求头是contenttype:application/json 将字典序列化成jason # request.data contenttype请求无法解析时会以byte放入data # request.cookies # request.headers # request.path # request.full_path # request.script_root # request.url # request.base_url # request.url_root # request.host_url # request.host # request.files # obj = request.files['the_file_name'] # obj.save('/var/www/uploads/' + secure_filename(f.filename))
响应相关信息
# return "字符串" # return render_template('html模板路径',**{}) # return redirect('/index.html')# response = make_response(render_template('index.html')) # response是flask.wrappers.Response类型 # response.delete_cookie('key') # response.set_cookie('key', 'value') # response.headers['X-Something'] = 'A value' # return response # return jsonfiy 返回序列化的json数据 # return send_file(file_name) 返回一个文件
二 模板语言
1、模板的使用
Flask使用的是Jinja2模板,所以其语法和Django无差别
2、自定义模板方法
Flask中自定义模板方法的方式和Bottle相似,创建一个函数并通过参数的形式传入render_template,如:
from flask import Flask,url_for,request,redirect,render_template,jsonify,make_response,Markup from urllib.parse import urlencode,quote,unquote app = Flask(__name__)def test(a1,a2):return a1+a2@app.template_global() def sb(a1,a2):return a1 + a2 + 100@app.template_filter() def db(a1, a2, a3):return a1 + a2 + a3@app.route('/index',endpoint='xx') def index():v1 = "字符串"v2 = [11,22,33]v3 = {'k1':'v1','k2':'v2'}v4 = Markup("<input type='text' />")return render_template('index.html',v1=v1,v2=v2,v3=v3,v4=v4,test=test)''' 函数模板 ''' from common.libs.UrlManager import UrlManagerapp.add_template_global(UrlManager.buildStaticUrl, 'buildStaticUrl') app.add_template_global(UrlManager.buildUrl, 'buildUrl') app.add_template_global(UrlManager.buildImageUrl, 'buildImageUrl')if __name__ == '__main__':# app.__call__app.run()
layout.html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><h1>模板</h1>{%block body %} {%endblock%}</body> </html>
index.html
{% extends 'layout.html'%}{%block body %}{{v1}}<ul>{% for item in v2 %}<li>{{item}}</li>{% endfor %}</ul>{{v2.1}}<ul>{% for k,v in v3.items() %}<li>{{k}} {{v}}</li>{% endfor %}</ul>{{v3.k1}}{{v3.get('k1')}}{{v4}}<!--{{v4|safe}}--><h1>{{test(1,19)}}</h1>{{sb(1,2)}}{{ 1|db(2,3)}}{% macro xxxx(name, type='text', value='') %}<input type="{{ type }}" name="{{ name }}" value="{{ value }}"><input type="{{ type }}" name="{{ name }}" value="{{ value }}"><input type="{{ type }}" name="{{ name }}" value="{{ value }}"><input type="{{ type }}" name="{{ name }}" value="{{ value }}">{% endmacro %}{{ xxxx('n1') }}{%endblock%}
三 session
当请求刚到来时:Flask会读取cookie中session对应的值。 将这个值解密并反序列化成字典放入内存以便视图函数使用
视图函数:
@app.route('/ses') def ses():session['k1'] = 123session['k2'] = 456del session['k1']return session
# 注意要在使用之前设置secret key
app.secret_key = 'sdfsdfsdf'
当请求结束时,Flask会读取内存中字典的值,进行序列化+加密,再写入到用户的cookie中
四 闪现
闪现是指在session中存储一个数据,读取时通过pop将数据移除
from flask import Flask,flash,get_flashed_messages@app.route('/page1') def page1():flash('临时数据存储', 'error')flash('sdfsdfsdffsdf', 'error')flash('asdfsdfsdfdsf', 'info')return "Session"@app.route('/page2') def page2():print(get_flashed_messages(category_filter=['error']))return "Session"
五 中间件
在call方法执行之前加入其它功能,实现类似中间件的功能
from flask import Flask, flash, redirect, render_template, request app = Flask(__name__) app.secret_key = 'some_secret'@app.route('/') def index1():return render_template('index.html')@app.route('/set') def index2():v = request.args.get('p')flash(v)return 'ok'class MiddleWare:def __init__(self,wsgi_app):self.wsgi_app = wsgi_appdef __call__(self, *args, **kwargs):# 在call方法执行之前加入其它功能,实现类似中间件的功能return self.wsgi_app(*args, **kwargs)if __name__ == "__main__":app.wsgi_app = MiddleWare(app.wsgi_app)app.run(port=9999)
六 特殊装饰器
- - before_firset_request
- - before_request # 再请求进入视图函数之前做出处理
- - after_request # 再请求结束视图函数之后,返回客户端之前 def go(response) return response 逆向执行 # 正常场景be1-be2-af2-af1 异常场景 be1-af2-af1
- - template_global()
- - template_filter()
- - errorhandler (404) # 在使用errorheadler传递参数 404 500 error(code_or_exp) return redirect("/index")
拦截验证用户是否登录的方法:
# -*- coding: utf-8 -*- from application import app from flask import request,g,redirectfrom common.models.User import ( User ) from common.libs.user.UserService import ( UserService ) from common.libs.UrlManager import ( UrlManager ) from common.libs.LogService import LogService import re @app.before_request def before_request():ignore_urls = app.config['IGNORE_URLS']ignore_check_login_urls = app.config['IGNORE_CHECK_LOGIN_URLS']path = request.path# 如果是静态文件就不要查询用户信息了pattern = re.compile('%s' % "|".join(ignore_check_login_urls))if pattern.match(path):returnif '/api' in path:returnuser_info = check_login()g.current_user = Noneif user_info:g.current_user = user_info# #加入日志# LogService.addAccessLog()pattern = re.compile('%s' % "|".join(ignore_urls))if pattern.match(path):returnif not user_info :return redirect( UrlManager.buildUrl( "/user/login" ) )return''' 判断用户是否已经登录 ''' def check_login():cookies = request.cookiesauth_cookie = cookies[app.config['AUTH_COOKIE_NAME']] if app.config['AUTH_COOKIE_NAME'] in cookies else Noneif '/api' in request.path:app.logger.info(request.path)auth_cookie = request.headers.get("Authorization")app.logger.info( request.headers.get("Authorization") )if auth_cookie is None:return Falseauth_info = auth_cookie.split("#")if len(auth_info) != 2:return Falsetry:user_info = User.query.filter_by(uid=auth_info[1]).first()except Exception:return Falseif user_info is None:return Falseif auth_info[0] != UserService.geneAuthCode( user_info ):return Falseif user_info.status != 1:return Falsereturn user_info
404错误拦截
# -*- coding: utf-8 -*- from application import app from common.libs.Helper import ops_render from common.libs.LogService import LogService@app.errorhandler(404) def error_404(e):LogService.addErrorLog(str(e))return ops_render('error/error.html', {'status': 404, 'msg': '很抱歉!您访问的页面不存在'})
七 蓝图
简单来说,Blueprint 是一个存储操作方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求。
Flask使用Blueprint让应用实现模块化,在Flask中,Blueprint具有如下属性:
- 一个应用可以具有多个Blueprint
- 可以将一个Blueprint注册到任何一个未使用的URL下比如 “/”、“/sample”或者子域名
- 在一个应用中,一个模块可以注册多次
- Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的
- 在一个应用初始化时,就应该要注册需要使用的Blueprint
但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。
使用蓝图的实例:
结构:
Mycrm
crm
static
template
login.html
views
account.py
order.py
models.py
__init__.py
manage.py
settings.py
__init__.py:
from flask import Flask from .views import account from .views import orderapp = Flask(__name__) print(app.root_path) # 注意一定要注册注册蓝图 app.register_blueprint(account.account) app.register_blueprint(order.order)
manage.py:
import crm if __name__ == '__main__'mycrm.app.runn()
account.py:
from flask import Blueprint,render_template account = Blueprint('account',__name__,)@account.route('/login') def login():# return 'Login'return render_template('login.html')
order.py:
from flask import Blueprintorder = Blueprint('order',__name__) @order.route('/order') def login():return 'Order'
转载于:https://www.cnblogs.com/harryblog/p/11159142.html
Flask详解(中篇)相关推荐
- Flask详解(下篇)
一 上下文管理 当前请求到来时Flask处理的流程图: 当一个请求到来时: 请求到来之后uwsgi会触发app的__call__方法, 由__call__方法再次调用wsgi_app方法 首先将请求相 ...
- Flask详解(上篇)
一 什么是Flask Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端, 其用于接收http请求 ...
- WCF服务端运行时架构体系详解[下篇]
作为WCF中一个核心概念,终结点在不同的语境中实际上指代不同的对象.站在服务描述的角度,我们所说的终结点实际上是指ServiceEndpoint对象.如果站在WCF服务端运行时框架来说,终结点实际上指 ...
- Qtum量子链研究院:Plasma技术详解(下篇)
Plasma的设计模型有两个主要的分支:Plasma MVP(Minimal Viable Plasma,最小可行的Plasma)和Plasma Cash.Plasma MVP的目标是为最基本的可用的 ...
- 从Java程序员进阶到架构师,6大核心技能要领详解
" java架构师技能将分为如下6大环节:数据结构和算法,Java高级特性,Java web核心,数据库,Java框架与必备工具,系统架构设计. 希望能真正帮助到从程序员进阶到架构师之路的朋 ...
- Python 装饰器详解(中)
Python 装饰器详解(中) 转自:https://blog.csdn.net/qq_27825451/article/details/84581272,博主仅对其中 demo 实现中不适合pyth ...
- 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)
在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...
- python flask安装_python flask安装和命令详解
Flask Web开发实战学习笔记 Flask简介 Flask是使用Python编写的Web微框架.Web框架可以让我们不用关 心底层的请求响应处理,更方便高效地编写Web程序.因为Flask核心简 ...
- 框架详解_详解:python Web框架flask表单实现(建议收藏)
今天为大家带来的内容是:python框架flask表单实现详解 文章内容主要介绍了python框架flask表单实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需 ...
最新文章
- 医疗信息安全再添新保障
- 配置tomcat支持ssl
- ACCESS的Ole对象读取
- 工业交换机和工业级光纤收发器的区别
- 如何关闭线程池?会创建不会关闭?调用关闭方法时线程池里的线程如何反应?
- 【离散数学】论域和客体函数的区别
- 博客版面设计~文章填充
- optparse命令解析模块
- 非递归归并排序详细分析
- 【应用随机过程】01. 随机过程的基本概念
- SoundPool基本用法
- 知识库 编号:002
- 后OA时代:流程再造
- mysql binlog定点恢复锁表_MySQL -- binlog 操作与恢复
- 打开计算机首先映入眼帘的一整屏称之为桌面,利用“活动桌面” 让桌面也“闪”起来...
- 数值型数据的表示(1.0)
- 经典算法(2):黄金分割法(Gold)
- electron-vue 引入electron-updater提示unexpected token
- C++实现学生选课管理系统
- 【实训项目】教师工作量管理系统