flask 基础2
一.装饰器的坑
在使用装饰器函数时候,当一个装饰器装饰多个函数的时候,会由于内存地址相同时发生报错,因为装饰的都是一个函数
所以就需要引入
import functools 重新定义每一个函数的名称
import functools
def waidu(fun):
@functools.wraps(fun)
def nei(*args,**kwargs):
if session.get('user'):
ret= fun(*args, **kwargs)
return ret
else:
return redirect('/login')
return nei
或者
在flask下也有一个内置 endpoint
二 flask中的路由
1.endpoint 反向生成url地址标识,默认是凸函数名url_for
@app.route('/', endpoint='index')#endpoint是route里面的属性,默认为NONE,则会显示函数名def index为默认
#要是标识出,就会区分每一个单独的函数名
def index():
print(request.path)
return render_template('home.html')
这样也可以区分装饰器的坑,通过引入
from flask import url_for
来检测
print (url_for()
若正确,则打印路由地址
2.methods 视图函数允许的请求方式
@app.route("/index/<page>",methods=["GET","POST"],endpoint="index")
methods默认get请求,若不声明则不会显示
3."/index/<page>" 动态路由路由参数
@app.route("/info/<page>", methods=['POST','GET'],endpoint='student',strict_slashes=True)
#<int:page>page是一个变量名,int声明是数字,默认声明str
#访问时,需要后面带着访问的字符串才会有页面
def student(page):
print(page,type(page))
return ""
4.defaults={"nid":"123456"} 默认参数,同样拼接在route里,打印的page是默认参数123456
5.strict_slashes=True 是否严格遵循路由地址#按照严格的网址关系,默认为false
6.redirect_to="/login" 永久重定向 301 没有302发生在显示页面之前,用在更换网址时直接跳转旧的网址
三.flask实例化配置
1.template_folder="temp" 默认模板路径 templates #在更改template时使用,直接指向更改后的名字,
2.static_folder="static", 默认静态文件路径 static #在更改静态文件后使用,直接指向更改后静态文件夹的名字
3.static_url_path="/static" 访问静态文件路由地址 默认是"/"+static_folder #再更改静态文件后,需要在前端更改静态文件的路径,使用时直接写更改后的静态文件路径/static
app = Flask(__name__,template_folder="template",static_folder="statics",static_url_path="/statics")
了解:
.static_host=None 指定静态文件服务器地址
.host_matching = False, # 如果不是特别需要的话,慎用,否则所有的route 都需要host=""的参数
.subdomain_matching = False, # 理论上来说是用来限制SERVER_NAME子域名的,但是目前还没有感觉出来区别在哪里
.instance_path = None, # 指向另一个Flask实例的路径
.instance_relative_config = False # 是否加载另一个实例的配置
.root_path = None # 主模块所在的目录的绝对路径,默认项目目录
四flask对象配置
'DEBUG': False, # 是否开启Debug模式
'TESTING': False, # 是否开启测试模式
'SECRET_KEY': None # 在启用Flask内置Session的时候/开启flash,一定要有它
'PERMANENT_SESSION_LIFETIME': , # days , Session的生命周期(天)默认31天
'SESSION_COOKIE_NAME': 'session', # 在cookies中存放session加密字符串的名字
对象配置需要新创建一个文件,
class FlaskDebug(object):
DEBUG=True
SECRET_KEY="SADIHAS"
PERMANENT_SESSION_LIFETIME=
SESSION_COOKIE_NAME="shadoubushi"
在flask里
import FlaskSetting
app.config.from_object(FlaskSetting.FlaskDebug)
就可以使用配置后的环境了
五.flask蓝图 (蓝图配置)
Blueprint :当成一个不能被启动的 app Flask示例
使用:
创建一个独立的文件夹

from flask import Blueprint,render_template
s4app = Blueprint("s4app",__name__,template_folder="apptemp",url_prefix="/blue")
@s4app.route("/s4app")
def s4appfunc():
return render_template("s4app.html")
url_prefix="/blue" url前缀
在访问时需要写在路由前127.0.0.1:8000/blue/s4app
注册:
app.register_blueprint(views.s4app)
例子:
from flask import Blueprint, render_template,request,jsonify,json
app01=Blueprint("app01",__name__,template_folder="temp")#每一个蓝图都需要声明一个名字,不可重复,可以创建多个蓝图
@app01.route("/app01",methods=["POST","GET"])
def app01func():
if request.method =="GET":
return render_template("01.html")
else:
print(request.form.to_dict())
dic={}
x=request.form.get("key")
y=request.form.get("value")
dic[x]=y
dicc=json.dumps(dic)
print(dic)
return render_template("01.html",dic=dicc)
flask
from flask import Flask
from bu import ha app=Flask(__name__)
app.register_blueprint(ha.app01) app.run()
六.flask特殊装饰器
@app.before_request # 请求进入视图函数之前
@app.before_request
def bel():
print("我是 before_request1")
return None
#默认return None 要是直接返回 三剑客 不会自行视图函数
@app.before_request
def be2():
print("我是before_request2")
@app.before_request
def be3():
print("我是before_request3")
@app.after_request # 响应返回客户端之前
@app.after_request
def af1(args):
print(args)
print("我是after_request1")
return args
#发生在返回给客户端之前,需要返回参数args,若没有客户端什么都不显示
@app.after_request
def af2(args):
print("我是after_request2")
return args @app.after_request
def af3(args):
print("我是after_request3")
return args
正常情况下流程:be1 - be2 - be3 - af3 - af2 - af1
异常情况下流程:be1 - af3 - af2 - af1
@app.errorhandler(404) # 重定义错误页面返回信息
def error404(error_info):
return三剑客+小儿子
@app.errorhandler(404)#声明出错信息 必须写
def error404(args):
print(args)#打印报错信息
return render_template("error.html")#返回自己写的报错信息 app.run(debug=True)
flask 基础2的更多相关文章
- flask基础之AppContext应用上下文和RequestContext请求上下文(六)
前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...
- flask基础之请求处理核心机制(五)
前言 总结一下flask框架的请求处理流程. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) flask基础之jijia2模板语言进阶(三) flask ...
- flask基础之app初始化(四)
前言 flask的核心对象是Flask,它定义了flask框架对于http请求的整个处理逻辑.随着服务器被启动,app被创建并初始化,那么具体的过程是这样的呢? 系列文章 flask基础之安装和使用入 ...
- flask基础之jijia2模板语言进阶(三)
前言 前面学习了jijia2模板语言的一些基础知识,接下来继续深挖jijia2语言的用法. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) 控制语句 和 ...
- flask基础之jijia2模板使用基础(二)
前言 在以前前后端不分离的时代,后台程序员往往又当爹又当妈,需要将前端程序员写的h5页面填充模板语言.而jijia2是一门十分强大的python的模板语言,是flask框架的核心模块之一.先简单介绍一 ...
- 笔记-flask基础操作
笔记-flask基础操作 1. 前言 本文为flask基础学习及操作笔记,主要内容为flask基础操作及相关代码. 2. 开发环境配置 2.1. 编译环境准备 安装相关Lib ...
- Flask基础(16)-->WTForms表单创建和简单验证
Flask基础(16)-->WTForms表单创建和简单验证 前言:使用Flask_WTF需要配置参数SECRET_KEYCSRF_ENABLED是为了CSRF(跨站请求伪造)保护.SECRET ...
- Flask基础(14)-->自定义过滤器
Flask基础(13)-->自定义过滤器 什么是过滤器? 过滤器的本质就是函数.有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化.运算等等,而在模板中是不能直接调用 P ...
- Flask基础(13)-->Flask扩展Flask-Script
Flask基础(12)-->Flask扩展Flask-Script # 前提是安装了Flask-Script # 联网运行 pip install flask-script from flask ...
- Flask基础(06)-->视图常用逻辑
Flask基础(06)-->视图常用逻辑 返回json 重定向:url_for 自定义状态码 返回json:在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中 ...
随机推荐
- Jmeter获取数据库查询结果某一字段的值
1.首先进行连接数据库 2.添加JDBC Request 3.添加BeanShell PostProcessor 4.注意点:如果获取的是INT数字类型的,结尾需要添加toString()
- c语言新知
C语言学得有点懈怠,昨个遇一个高手. 教了我两天,真细腻. 第一天,让我写一个程序删除字符串多余空格. 我俩代码对比 结果很显然了.
- MySQL实战45讲学习笔记:第四十二讲
一.本节概述 在 MySQL 里面,grant 语句是用来给用户赋权的.不知道你有没有见过一些操作文档里面提到,grant 之后要马上跟着执行一个 flush privileges 命令,才能使赋权语 ...
- Asp.Net Core 工作单元 UnitOfWork UOW
Asp.Net Core 工作单元示例 来自 ABP UOW 去除所有无用特性 代码下载 : 去除所有无用特性版本,原生AspNetCore实现 差不多 2278 行代码: 链接:https://pa ...
- Python连载18-closure闭包解释及其注意点
一.闭包 1.定义:当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数之中,这种结果,叫做闭包. 2.例子:连载17中 ...
- 《一起学mysql》2
事务 爸妈让往他们银行卡里转点儿钱,可是我这钱全在支付宝里,爸妈又没有支付宝,只能从支付宝里转给他 们了,假如转账过程中,支付宝扣款成功了,但是银行系统崩溃了,钱没转进去,这咋整?我的大洋就这样 ...
- mysql id 自增实现
1.在mysql中建表 2.使用: >insert into 表名 values(id,'www',66); 连续运行5次后结果: =============================== ...
- HTML+css基础 css的几种形式 css选择器的两大特性
3.外联样式 css选择器的两大特性 1.继承性:所有跟文本字体有关的属性都会被子元素继承.且权重是0000. 2.层叠性:就是解决选择器权重大小的一种能力,就是看那个选择器的权重大.谁的权重大听谁的 ...
- vuex源码分析(二) state及strict属性 详解
state也就是vuex里的值,也即是整个vuex的状态,而strict和state的设置有关,如果设置strict为true,那么不能直接修改state里的值,只能通过mutation来设置 例1: ...
- CodeForce 577B Modulo Sum
You are given a sequence of numbers a1, a2, ..., an, and a number m. Check if it is possible to choo ...