Flask入门flask-script 蓝本 钩子函数(三)
1 flask-script扩展库
概念: 是一个flask终端运行的解析器 ,因为项目完成以后,代码改动会有风险,所以借助终端完成不同启动项的配置
安装
pip3 install flask-script
使用
from flask_script import Manager #导入
manager = Manager(app) #初始化flask运行的解析器
manager.run() #运行
执行程序需要在启动项输入命令
python3 当前启动文件名.py runserver 可选参数
可选参数如下:
-h 主机名
-p 端口号
--threaded 开启多线程
-d 开启调试模式
-r 代码修改后重新加载
例如:
python3 manage.py runserver -d -r -h127.0.0.1 -p5001 --threaded 参数全部加上
2 Blueprint蓝图
**概念 **: Blueprint通过把实现不同功能的module分开,实现分类功能,从而把一个大的application分割成各自实现不同功能的module。在一个Blueprint中可以调用另一个blueprint的view function, 但要加相应的blueprint名。本质上来说就是让程序更加松耦合,更加灵活,增加复用性,提高查错效率.
导入
from flask import Blueprint,session
使用 : 创建蓝图路由文件userinfo.py文件
from flask import Blueprint
user = Blueprint('user',__name__)
@user.route('/login')
def login():
return 'login'
注意 : 1 Blueprint接受两个参数实例化,分别文蓝本名与蓝本所在的包与模块
2 蓝本实质上也是一个命名空间
在启动文件中注册蓝本: app/__init__.py,一般在初始化时候注册蓝图
from mysession import user
app.register_blueprint(user) #app注册蓝本user
app.register_blueprint(user,url_prefix='/user') #在app中注册蓝本user,并添上前缀/user
下面我们以一个具体例子说明: 假定一个文件系统
--app
--main
__init__.py
errors.py
forms.py
views.py
__init__.py
其中mian就是蓝本模块,错误信息保存在errors.py,视图函数保存在views.py文件中
(1) 创建蓝本:
在文件app/main/__init__.py添加定义:
from flask import Blueprint
main = Blueprint('admin',__name__)
from . import views,errors
注:1 通过实例化Blueprint类的对象创建一个蓝本
2 视图与errors的导入应放在蓝本创建之后,防止循环导入问题
在文件app/main/views.py中添加视图函数:
from . import main #当前目录下导入蓝本
from flask import render_template
@main.route('/test/')
def test():
return render_template('main/test.html'),200
注: 1 跳转到模板页面test.html
在文件app/main/errors.py中添加错误视图函数:
from flask import render_template
from app.main import main #导入蓝本
#捕捉404状态码
@main.app_errorhander(404)
def page_not_found(e):
return render_tamplate('main/404.html'),404
#捕捉500状态码
@main.app_errorhander(500)
def internal_server_error(e):
return render_template('main/500.html'),500
(2) 注册蓝本
在app/__init__.py中添加注册蓝本代码
from app.main import main #导入蓝本
app.register_blueprint(main,url_prefix='/admin')
(3) 构造url路由
在view视图中有函数test
url_for('main.test') url_for('蓝本名.视图函数名')
3 钩子函数
类似于django中间件 在使用的时候需要使用装饰器,使得 程序变成 A函数--->钩子函数---->B函数,
flask项目中有个是应用上下文(app),一个是请求上下文(request),请求上下文request和应用上下文current_app都是一个全局变量。所有请求都共享的。Flask有特殊的机制可以保证每次请求的数据都是隔离的,即A请求所产生的数据不会影响到B请求。所以可以直接导入request对象,不会受到外界影响
两个上下文一般包含4个属性:
- request : 请求上下文的对象,一般用来保存一些请求的变量。比如method、args、form等。
- session: 请求上下文的对象,一般用来保存一些会话信息.
- current_app: 返回当前App
- g: 全局变量,应用上下文的对象,处理请求时作为临时存储的对象 : g.message存储信息
| 钩子函数 | 功能描述 |
|---|---|
| before_first_request | 第一次请求之前 |
| before_request | 每次请求之前 |
| after_request | 每次请求之后 |
| teardown_request | 不管是否异常都会在请求之后执行 |
| context_processor | 上下文处理器,返回字典的健 |
| errorhandler | errorhandler接收状态码,可以自定义返回状态码的响应页面 |
注 : 在蓝本中使用钩子函数需要进行转化: @mysession.teardown_app_request 蓝本名.teardown_app_request
4 g对象
g : 全局变量,需要导入使用 from flask import g
- g对象专门用来保存用户数据的
- g对象在一次请求中所有代码都是公用的
例如: 在提交表单中测试下 action='{{ url_for('login') }}' method='post'
login_user.html
<form action="{{ url_for('login') }}" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" placeholder="请输入用户名" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="text" placeholder="请输入密码" name="password"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登录"></td>
</tr>
</table>
</form>
视图函数utils.py中
from flask import g
def login_username():
return u'当前登录用户:{}'.format(g.username)
def login_password():
return u'当前密码:{}'.format(g.password)
在主文件视图函数中views.py
from flask import Flask,g,request,render_template
from utils import login_username
app = Flask(__name__)
@app.route('/login/',methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
username = request.form.get('username')
password = request.form.get('password')
g.username = username #将username变成全局g对象信息存储
g.password = password #将password变成全局g对象信息存储
login_username()
login_password()
return u'登录成功!'
if __name__ == '__main__':
app.run()
Flask入门flask-script 蓝本 钩子函数(三)的更多相关文章
- flask框架基本使用(4)(钩子函数,异常,命令行运行)
flask 框架基本使用(1):https://www.cnblogs.com/chichung/p/9756935.html flask 框架基本使用(2):https://www.cnblogs. ...
- Flask入门 flask结构 url_for 重定向(一)
Flask入门(一) 1 安装虚拟环境Mac,linux sudo pip install virtualenv ubuntu系统 sudo apt-get install python-virt ...
- Flask入门模板Jinja2语法与函数(四)
1 模板的创建 模板文件结构: project/ templates/ 模板文件 跳转模板一般使用: from flask import render_template,render_template ...
- Vue -自定义指令&钩子函数
除了核心功能默认内置的指令,Vue也允许注册自定义指令 页面加载后,让文本框自动获取焦点,原生js做法是获取文本框元素后调用focus()方法,但Vue不建议手动操作DOM元素,所以此时要自定义指令 ...
- day 84 Vue学习四之过滤器、钩子函数、路由、全家桶等
本节目录 一 vue过滤器 二 生命周期的钩子函数 三 vue的全家桶 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 Vue的过滤器 1 moment.js 在这里我们先介绍一个 ...
- day 83 Vue学习四之过滤器、钩子函数、路由、全家桶等
Vue学习四之过滤器.钩子函数.路由.全家桶等 本节目录 一 vue过滤器 二 生命周期的钩子函数 三 vue的全家桶 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 Vue的过滤 ...
- (三)flask中的请求钩子函数
请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图 ...
- flask系列八之请求方法、g对象和钩子函数
一.get方法 ,post方法 post请求在模板中要注意几点: (1)input标签中,要写name来标识这个value的key,方便后台获取. (2)在写form表单的时候,要指定method=' ...
- 11.Flask钩子函数
在Flask中钩子函数是使用特定的装饰器的函数.为什么叫做钩子函数呢,是因为钩子函数可以在正常执行的代码中,插入一段自己想要执行的代码,那么这种函数就叫做钩子函数. before_first_requ ...
随机推荐
- Windows 搭建ASP.NET Boilerplate项目开发环境
1.本机安装对应版本的.net core 2.安装vs2017或以上版本 3.从ABP官网下载模板,我下载的是前后端分离的Angular模板 4.用vs2017分别打开前后端,还原Nuget包 5.前 ...
- 【算法笔记】B1016 部分A+B
1016 部分A+B (15 分) 正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA 组成的新整数 PA.例如:给定 A=3862767,DA=6,则 A ...
- 洛谷 P4036 [JSOI2008]火星人(splay+字符串hash)
题面 洛谷 题解 首先,我们知道求最长公共前缀可以用二分答案+hash来求 因为有修改操作, 考虑将整个字符串的hash值放入splay中 接着就是splay的基本操作了 Code #include& ...
- 2016 ccpc 杭州 D.Difference hdu5936(折半枚举)
有坑!!!当x==0时,因为y>0,a,b不能同时为0,所以答案要-1 #include<iostream> #include<cstdlib> #include< ...
- POJ - 3263 差分+前缀和
只需不断维护相对值的前缀就能得到解 这种思想第一次是在树状数组区间更新那里看到的,由于题目要求是1~n所以直接可以用前缀和维护 注意不能直接-1 +1 还有POJ的数据..要不是书里有提谁知道会这么毒 ...
- matlab实用教程
苏金明.2005.电子工业 1 语句末尾加 : 可以不显示到屏. who 查看变量 whos 列出变量信息 exist t 判断变量是否在空间中. help 函数 doc 函数 : doc f ...
- pjsip与QT进行适配
pjsip是纯C语言写的一个sip协议库,整个代码写得还是比较模块化的,得益于此的设计,只要理解了pjsip的设计,就可以对其网络层进行扩展. 我们项目是QT作为主要开发工具,而PJSIP的库默认是利 ...
- [linux]解决DNS配置重启丢失
DNS配置重启丢失 每次重启后都修改DNS配置文件 /etc/resolv.conf从网上得知 /etc/resolv.conf中的DNS配置是从/etc/resolvconf/resolv.conf ...
- Servlet3.0的文件上传功能
在Servlet3.0之前,文件上传需要借助于第三方插件,在Servlet3.0之后,Servlet本身开始支持文件上传功能. 获取上传的文件可以通过HTTPServletRequest的getPar ...
- 【PPTP】windows & linux 安装pptp
1.Windows下安装 PPTP 打开网络和共享中心 更改适配器配置 按一下alt,之后,点击左上角的文件---->新建传入连接 在新建传入连接这边点击添加用户 如输入用户名:Evelyn ...