视图函数增添装饰器
from flask import Flask, views, render_template, request
# 各模板的作用 Flask 用于创建对象, views 充当父类, render_template 用于连接 html 文件, request 用于获取 url 信息
web = Flask(__name__) # 创建实例化对象
# 登录之后才能访问的装饰器
def login_required(func):
def wrapper(*args, **kwargs):
# 通过网址上的 url 获取到参数 username
username = request.args.get('username')
if username:
# 如果检测到 username 的存在, 那么返回原函数
return func(*args, **kwargs)
else:
# 如果监测不到 username 的存在, 那么渲染文本
return '请先登录'
return wrapper
@web.route('/profile/')
@login_required # 此处装饰器的作用是将 profile 函数当作 func 函数传入装饰器中
def profile():
# 通过网址上的 url 获取到参数 username, 并且赋值给 name
name = request.args.get('username')
# 在浏览器上渲染文本
return name + '的个人中心'
if __name__ == '__main__':
# 运行时指定 debug 模式
web.run(debug=True)
获取的 url 中含有参数 username 的情况,返回原函数
获取的 url 中不含有参数 username 的情况,直接在装饰器内渲染文本
视图类增添装饰器
from flask import Flask, views, render_template, request
# 各模板的作用 Flask 用于创建对象, views 充当父类, render_template 用于连接 html 文件, request 用于获取 url 信息
web = Flask(__name__) # 创建实例化对象
# 登录之后才能访问的装饰器
def login_required(func):
def wrapper(*args, **kwargs):
# 通过网址上的 url 获取到参数 username
username = request.args.get('username')
if username:
# 如果检测到 username 的存在, 那么返回原函数
return func(*args, **kwargs)
else:
# 如果监测不到 username 的存在, 那么渲染文本
return '请先登录'
return wrapper
class ProfileView(views.View): # 继承于 views.View 类, 需要重写 dispatch_request 方法
# 语法:decorators = [装饰器的名字]
decorators = [login_required]
def __init__(self):
self.name = request.args.get('username')
def dispatch_request(self):
return self.name + '的个人中心类'
# 给视图类增添 url 属性
web.add_url_rule('/setting/', view_func=ProfileView.as_view('setting'))
if __name__ == '__main__':
# 运行时指定 debug 模式
web.run(debug=True)
获取的 url 中含有参数 username 的情况,返回原函数
获取的 url 中不含有参数 username 的情况,直接在装饰器内渲染文本
视图类 Get 方法和 Post 方法
Python 文件
from flask import Flask, views, render_template, request
# 各模板的作用 Flask 用于创建对象, views 充当父类, render_template 用于连接 html 文件, request 用于获取 url 信息
web = Flask(__name__) # 创建实例化对象
# get 和 post 方法
class LoginView(views.MethodView): # 继承于类 views.MethodView 不需要重写 dispatch_request 方法
def get(self, error=None):
return render_template('login.html', error=error)
def post(self):
# post 方法获取 url 中参数的方法 request.form.get
name = request.form.get('name')
password = request.form.get('password')
if name == 'XiaoSu' and password == '521':
return 'Welcome XiaoSu'
else:
# return render_template('login.html', error='账号密码错误,请重新输入')
return self.get('账号或密码错误, 请重新输入')
# 给视图类增添 url 属性
web.add_url_rule('/login/', view_func=LoginView.as_view('login'))
if __name__ == '__main__':
# 运行时指定 debug 模式
web.run(debug=True)
Html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>这是登录页面</h1>
{%if error%}
<p style='color:red'>{{err}}</p>
{%endif%}
</body>
</html>
网址 url 为 /login/ 时访问到了 login.html 文件中的 h1 标签
网址 url 为 /login/?name=xiaosu&password=521 时渲染文本
网址 url 为 /login/?name=xiaosu&password=520 时访问到了 login.html 文件中的 h1 标签和用 css 修饰的 p 标签
一种专门书写视图函数的模块(蓝图)
实现的具体功能是,在 python 副文件内部书写了视图函数,在主文件内部只需要通过某种关联即可以调用副文件内部的视图函数,将视图函数和主文件分开,使代码更加可视化
Python 主文件
from flask import Flask, url_for
# 从 flask 框架中导入 Flask 模块和 url_for 模块
from blueprints.book import book_bp
# 从 blueprints.book 中导入实例化蓝图对象 book_bp
web = Flask(__name__) # 实例化 Flask 对象
web.register_blueprint(book_bp) # 绑定蓝图对象
@web.route('/') # 关联视图函数
def index(): # 视图函数
print(url_for('book.book_detail', aid=1)) # 输出 book.py 下的 book_detail 函数的 url
return '首页'
if __name__ == '__main__':
web.run(debug=True)
Python 蓝图文件
# 视图函数模板部分
from flask import Blueprint, render_template
# 模块:Blueprint 实例化蓝图对象, render_template 连接 html 文件
book_bp = Blueprint('book', __name__, url_prefix='', template_folder='logic')
# 实例化对象 book_bp, 参数 book 为蓝图文件名字, 参数 template_folder 修改 html 原始目录
@book_bp.route('/book/') # 蓝图绑定视图函数
def book(): # 视图函数
return '图书首页'
@book_bp.route('/detail/<aid>') # 蓝图绑定视图函数
def book_detail(aid): # 视图函数
return render_template('book.html')
Html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>蓝图图书首页</h1>
</body>
</html>
当 url 为 / 时,调用的是主文件内部书写的视图函数
当 url 为 /book/ 或 /detail/2 时,调用的是副文件内部书写的视图函数
参数的介绍以及 CSS 文件的引入
pycharm 文件层级关系
蓝图实例化对象时,参数 url_prefix 传递代表给蓝图中的所有视图函数添加 url 前缀,我们给其增添前缀 /a/
book_bp = Blueprint('book', __name__, url_prefix='/a/', template_folder='logic')
可以发现,原来可以打开的文件打不开了,原因也就很显然了,就是 url 指定不对,我们添加 url 前缀 /a/
添加前缀后,我们刷新浏览器
我们此处说的 CSS 文件的引入指的是在 html 文件内部引入 CSS 文件,与前端不同的是,我们使用参数 url_for 来引入
Html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{{url_for('static', filename='book.css')}}">
</head>
<body>
<h1>蓝图图书首页</h1>
</body>
</html>
CSS 文件
body{
background:pink;
}
渲染效果