一 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详解(中篇)相关推荐

  1. Flask详解(下篇)

    一 上下文管理 当前请求到来时Flask处理的流程图: 当一个请求到来时: 请求到来之后uwsgi会触发app的__call__方法, 由__call__方法再次调用wsgi_app方法 首先将请求相 ...

  2. Flask详解(上篇)

    一 什么是Flask Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端, 其用于接收http请求 ...

  3. WCF服务端运行时架构体系详解[下篇]

    作为WCF中一个核心概念,终结点在不同的语境中实际上指代不同的对象.站在服务描述的角度,我们所说的终结点实际上是指ServiceEndpoint对象.如果站在WCF服务端运行时框架来说,终结点实际上指 ...

  4. Qtum量子链研究院:Plasma技术详解(下篇)

    Plasma的设计模型有两个主要的分支:Plasma MVP(Minimal Viable Plasma,最小可行的Plasma)和Plasma Cash.Plasma MVP的目标是为最基本的可用的 ...

  5. 从Java程序员进阶到架构师,6大核心技能要领详解

    " java架构师技能将分为如下6大环节:数据结构和算法,Java高级特性,Java web核心,数据库,Java框架与必备工具,系统架构设计. 希望能真正帮助到从程序员进阶到架构师之路的朋 ...

  6. Python 装饰器详解(中)

    Python 装饰器详解(中) 转自:https://blog.csdn.net/qq_27825451/article/details/84581272,博主仅对其中 demo 实现中不适合pyth ...

  7. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  8. python flask安装_python flask安装和命令详解

    Flask Web开发实战学习笔记 Flask简介 Flask是使用Python编写的Web微框架.Web框架可以让我们不用关 心底层的请求响应处理,更方便高效地编写Web程序.因为Flask核心简 ...

  9. 框架详解_详解:python Web框架flask表单实现(建议收藏)

    今天为大家带来的内容是:python框架flask表单实现详解 文章内容主要介绍了python框架flask表单实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需 ...

最新文章

  1. 医疗信息安全再添新保障
  2. 配置tomcat支持ssl
  3. ACCESS的Ole对象读取
  4. 工业交换机和工业级光纤收发器的区别
  5. 如何关闭线程池?会创建不会关闭?调用关闭方法时线程池里的线程如何反应?
  6. 【离散数学】论域和客体函数的区别
  7. 博客版面设计~文章填充
  8. optparse命令解析模块
  9. 非递归归并排序详细分析
  10. 【应用随机过程】01. 随机过程的基本概念
  11. SoundPool基本用法
  12. 知识库 编号:002
  13. 后OA时代:流程再造
  14. mysql binlog定点恢复锁表_MySQL -- binlog 操作与恢复
  15. 打开计算机首先映入眼帘的一整屏称之为桌面,利用“活动桌面” 让桌面也“闪”起来...
  16. 数值型数据的表示(1.0)
  17. 经典算法(2):黄金分割法(Gold)
  18. electron-vue 引入electron-updater提示unexpected token
  19. C++实现学生选课管理系统
  20. 【实训项目】教师工作量管理系统

热门文章

  1. 目标反射回波检测算法及其FPGA实现 之二:互相关/卷积/FIR电路的实现
  2. java处理获取到的Elasticsearch数据
  3. MySQL-数据操作-增删改查
  4. 灭顶之灾之网络电视精灵——S2 2.8
  5. 今天我的天空瞬间明亮了
  6. awk 正则表达式、正则运算符详细介绍
  7. Linux---进程的基本概念
  8. 力扣 有序数组的平方
  9. 虽说下班时间自己说了算
  10. 退休是否需要等到对应日再进行办理?