flask基础2
一个装饰器无法装饰多个函数的解决方法
当我们想在flask的多个视图函数前添加同一个装饰器时,如果什么都不做会报一个错
AssertionError: View function mapping is overwriting an existing endpoint function: nei
from flask import Flask, redirect, render_template, request, session app = Flask(__name__)
app.secret_key = "" def wai(func):
def nei(*args, **kwargs):
if session.get("user"):
ret = func(*args,**kwargs)
return ret
else:
return redirect("/login")
return nei @app.route("/")
@wai
def index():
return render_template("index2.html") @app.route("/qqq")
@wai
def qqq():
return render_template("qqq.html") @app.route("/login", methods=["POST", "GET"])
def login():
if request.method == "GET":
return render_template("login.html")
else:
if request.form.get("username") == "" and request.form.get("password") == "":
session["user"] = request.form.get("username")
return "登录成功" app.run(debug=True)
会报上面的错,原因是用装饰器去装饰函数时返回的是nei这个函数,也就是有两个nei函数,所以报错
解决方案1
import functools #引入一个函数工具 def wai(func):
@functools.wraps(func) #加上这句就会保留原来的函数名
def nei(*args, **kwargs):
if session.get("user"):
ret = func(*args,**kwargs)
return ret
else:
return redirect("/login")
return nei
解决方案2
因为是flask视图函数,所以它为我们准备了一个参数endpoint 它反向生成url地址标志,默认视图函数名
@app.route("/", endpoint="index")
@app.route("/qqq", endpoint="qqq")
1.flask中的路由
1.endpoint 反向生成url地址标志 默认视图函数名 可以from flask import url_for url_for("")
2.methods 视图函数允许的请求方式
@app.route("/login", methods=["GET", "POST"]) #默认下面的函数只有get请求,一旦添加了methods参数就会按照添加的请求方式处理,后面是一个可迭代对象列表或元组
3.动态路由参数
@app.route("/login/<string:nid>", methods=["GET", "POST"], strict_slashes=False) #<string:nid>只有string或int类型,不写就是string 有动态路由参数下面的函数必须接受参数
def index2(nid):
print(url_for("index2"))
print(nid)
return ""
4.defaults={"nid":"123456"} 默认参数
5.strict_slashes=True 是否严格遵循路由地址 不写就是false
6.redirect_to="/login" 永久重定向 301 #进入视图之前
2.flask实例化配置
app = Flask(__name__, template_folder="templates", static_folder="static", static_url_path="/static")
1.template_folder="temp" 默认模板路径 templates
2.static_folder="static", 默认静态文件路径 static
3.static_url_path="/static" 访问静态文件路由地址 默认是"/"+static_folder 4.static_host=None 指定静态文件服务器地址
5.host_matching = False, # 如果不是特别需要的话,慎用,否则所有的route 都需要host=""的参数
6.subdomain_matching = False, # 理论上来说是用来限制SERVER_NAME子域名的,但是目前还没有感觉出来区别在哪里
7.instance_path = None, # 指向另一个Flask实例的路径
8.instance_relative_config = False # 是否加载另一个实例的配置
9.root_path = None # 主模块所在的目录的绝对路径,默认项目目录
3.flask对象配置
'DEBUG': False, # 是否开启Debug模式
'TESTING': False, # 是否开启测试模式
'SECRET_KEY': None # 在启用Flask内置Session的时候/开启flash,一定要有它
'PERMANENT_SESSION_LIFETIME': 31, # days , Session的生命周期(天)默认31天
'SESSION_COOKIE_NAME': 'session', # 在cookies中存放session加密字符串的名字
#配置方式1
app.config["DEBUG"] = True
#配置方式2
FlaskSetting.py
--------------------------------------
class FlaskDebug(object):
DEBUG = True
SECRET_KEY = "LIANNDA"
PERMANENT_SESSION_LIFETIME = 7
SESSION_COOKIE_NAME = "debug_session" class FlaskTesting(object):
DEBUG = True
SECRET_KEY = "LIANNDA"
PERMANENT_SESSION_LIFETIME = 15
SESSION_COOKIE_NAME = "test_session"
---------------------------------------------------------------- import FlaskSetting
app.config.from_object(FlaskSetting.FlaskDebug)
app.config.from_object(FlaskSetting.FlaskTesting)
4.flask蓝图(蓝图配置)
Blueprint 当成一个不能被启动的 app Flask示例
# 蓝图配置
from flask import Blueprint, render_template s4app = Blueprint("s4app", __name__, template_folder="apptemp", url_prefix="/lantu") #前三个参数必须给,后一个可选,如果添加了在访问时/lantu/s4app @s4app.route("/s4app")
def s4appa(): # 蓝图实例名不要与函数名重复
return render_template("s4app.html")
#在flask实例上注册蓝图,才能访问
from user_reg import views
app.register_blueprint(views.s4app)
5.flask中的特殊装饰器
@app.before_request # 请求进入视图函数之前
@app.after_request # 响应返回客户端之前
如果有多个before_request按从上到下执行,多个after_request按从下到上执行
正常情况下流程:be1 - be2 - be3 - af3 - af2 - af1
异常情况下流程:be1 - af3 - af2 - af1
@app.before_request
def be1():
if request.path == "/login":
return None
if not session.get("user"):
return redirect("/login") @app.after_request
def af1(response):
return response
@app.errorhandler(404) # 重定义错误页面返回信息
@app.errorhandler(404) #填错误码
def error404(error): #接收参数为错误信息
return render_template("my_error.html")
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 中 ...
随机推荐
- [LeetCode] 359. Logger Rate Limiter 记录速率限制器
Design a logger system that receive stream of messages along with its timestamps, each message shoul ...
- [计算机视觉][神经网络与深度学习]Faster R-CNN配置及其训练教程2
faster-rcnn分为matlab版本和python版本,首先记录弄python版本的环境搭建过程.matlab版本见另一篇:faster-rcnn(testing): ubuntu14.04+c ...
- SpringBoot系列教程web篇之Post请求参数解析姿势汇总
作为一个常年提供各种Http接口的后端而言,如何获取请求参数可以说是一项基本技能了,本篇为<190824-SpringBoot系列教程web篇之Get请求参数解析姿势汇总>之后的第二篇,对 ...
- java常见集合
集合与数组区别 1-从长度来讲: 数组:需要固定长度. 集合:长度可以改变,可以根据保存的数据进行扩容. 2-从存储内容上: 数组:可以存储基本类型数据,还可以存储引用类型的数据(比如:String ...
- ll问题
不能直接用ll 要用__int64 (64和int 之间无空格) #define ll __int64
- Jenkins运行python脚本出现 configparser.NoSectionError: No section: 'XXXXXX'
原来的代码如下: def get_test_config(tag, key, config="config.ini"): cf = configparser.ConfigParse ...
- [转帖]PC虚拟化主流:KVM、XEN、OpenVZ详解
PC虚拟化主流:KVM.XEN.OpenVZ详解 https://zhuanlan.zhihu.com/p/90920566 1.pc虚拟化——KVM KVM是完整的硬件虚拟化,可以在Windows ...
- python基础 — Mysql Server
sql server对于字符类型的有:char:固定长度,存储ANSI字符,不足的补英文半角空格.nchar:固定长度,存储Unicode字符,不足的补英文半角空格varchar:可变长度,存储ANS ...
- Golang_互斥锁
为什么需要锁? 在并发的情况下,多个线程或协程同时去修改一个变量.使用锁能保证在某一时间点内,只有一个协程或线程修改这一变量. 锁的概念就是,我正在处理 a(锁定),你们等着,等我处理完了(解锁),你 ...
- gorm - postgresql 如何连接?
上面是mysql