Flask(10)- 标准类视图(下)

简介: Flask(10)- 标准类视图(下)

app.py 应用主入口

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/7/13 10:31 下午
# file: 8_app.py
"""
from flask import Flask, views
from s8_userview import UserView
app = Flask(__name__)
app.add_url_rule('/user/', view_func=UserView.as_view('UserView'))
app.run(debug=True)


user.html 代码

<html>
<body>
<h2>name = {{ name }}</h2>
<h2>gender = {{ gender }}</h2>
</body>
</html>


浏览器访问的效果

image.png


使用装饰器


在视图函数、视图类中使用装饰器还是一大杀器

 

检查登录功能

不使用装饰器前的代码

def check_login():
    if 用户已经登录:
        return True
    else:        
        return False
@app.route('/page1', page1)
def page1():
    if not check_login():
        return '请先登录'
    执行 page1 的功能
@app.route('/page2', page2)
def page2():
    if not check_login():
        return '请先登录'
    执行 page2 的功能


  • 在处理 /page1 和 /page2 时需要检查登录,在函数 page1 () 和 page2 () 的头部调用 check_login 函数
  • 这种方法虽然实现了功能,但不够简洁

 

检查登录的装饰器

使用装饰器实现登录的功能,定义检查登录的装饰器 check_login

from flask import request
from functools import wraps
def check_login(original_function):
    @wraps(original_function)
    def decorated_function(*args, **kwargs):
        user = request.args.get("user")
        if user and user == "zhangsan":
            return original_function(*args, **kwargs)
        else:
            return "请登录"
    return decorated_function()


  • 装饰器 check_login 本质是一个函数
  • 它的输入是一个函数 original_function
  • 它的输出也是一个函数 decorated_function
  • original_function 是原先的处理 URL 的视图函数,它不包含检查登录的功能逻辑,就是到时候需要添加装饰器的函数
  • decorated_function 是在 original_function 的基础上进行功能扩充的函数(这就是装饰器的功能),它首先检查是否已经登录,如果已经登录则调用 original_function,如果没有登录则返回错误
  • 使用 functools.wraps (original_function) 保留原始函数 original_function 的属性

 

在视图函数中使用装饰器

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/7/13 10:31 下午
# file: 8_app.py
"""
from flask import Flask, request
from functools import wraps
app = Flask(__name__)
# 定义装饰器
def check_login(original_function):
    @wraps(original_function)
    def decorated_function(*args, **kwargs):
        user = request.args.get("user")
        if user and user == "zhangsan":
            return original_function(*args, **kwargs)
        else:
            return "请登录"
    return decorated_function()
@app.route("/page1")
@check_login
def page1():
    return "page1"
@app.route("/page2")
@check_login
def page2():
    return "page2"
app.run(debug=True)


  • page1、page2 两个视图函数更关注请求处理,而检查登录的功能交给装饰器去负责
  • 这样,检查登录的功能与 page1 和 page2 本身的功能是分离的

 

浏览器访问的效果

image.png

在视图类中使用装饰器

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/7/13 11:06 下午
# file: 8_viewclass_decorated.py
"""
from flask import Flask, request, views
from functools import wraps
app = Flask(__name__)
def check_login(original_function):
    @wraps(original_function)
    def decorated_function(*args, **kwargs):
        user = request.args.get("user")
        if user and user == 'zhangsan':
            return original_function(*args, **kwargs)
        else:
            return '请先登录'
    return decorated_function
class Page1(views.View):
    decorators = [check_login]
    def dispatch_request(self):
        return 'Page1'
class Page2(views.View):
    decorators = [check_login]
    def dispatch_request(self):
        return 'Page2'
app.add_url_rule(rule='/page1', view_func=Page1.as_view('Page1'))
app.add_url_rule(rule='/page2', view_func=Page2.as_view('Page2'))
app.run(debug=True)


decorators = [check_login] 设定视图类的装饰器

相关文章
|
1天前
|
JSON 数据处理 数据库
Flask视图函数与响应处理的艺术
【4月更文挑战第15天】本文探讨了Flask框架中视图函数和响应处理的原理与实践。视图函数通过`@app.route()`装饰器与URL关联,处理用户请求并返回响应。示例展示了如何从URL或请求对象获取参数,以及执行不同操作后返回响应。Flask支持字符串、元组和响应对象等多种响应类型。最佳实践包括保持视图函数简洁、使用模板引擎、处理异常和设置正确状态码。掌握这些技能能提升Web应用的用户体验和开发效率。
|
1天前
|
网络架构 Python
Flask路由与视图:构建你的第一个Web应用
【4月更文挑战第15天】Flask是Python的Web框架,其核心是路由和视图。路由通过`@app.route()`装饰器定义,将URL映射到视图函数。视图函数处理请求并返回响应。动态路由允许URL包含可变部分,如`&lt;username&gt;`,将参数传递给函数。本文通过示例展示了如何创建显示待办事项列表的Web应用,包括定义路由、视图、使用模板以及运行应用。这为基础的Flask应用开发提供了基础。
|
1天前
|
网络协议 测试技术 Python
PythonWeb开发基础(三)类Flask框架请求封装
类Flask框架请求封装 Web服务器 本质是个TCP服务器,监听在特定端口上 支持HTTP协议,能够将HTTP请求报文进行解析,能够把响应数据进行HTTP协议的报文封装并返回浏览器端。
49 0
|
9月前
|
Python
【flask】URL和视图映射
【flask】URL和视图映射
37 0
|
9月前
|
搜索推荐 Apache Python
Flask | Flask基础 - URL与视图
Flask | Flask基础 - URL与视图
|
10月前
|
Linux 定位技术 调度
Flask之视图高级(二)
Flask之视图高级(二)
|
10月前
|
Python
Flask之视图高级(一)
Flask之视图高级(一)
|
12月前
|
Python
一分钟快速实现Flask框架的蓝图和视图
一分钟快速实现Flask框架的蓝图和视图
|
调度 Python
Flask学习与项目实战4:视图高级之蓝图和子域名、类视图
对于大项目,代码都不放在app.py里面,需要分类。 即类似javaspringboot中的分层?每个功能分为一个更小规格的层次。 url_prefix 就是 蓝图的前缀。 和book相关的都在book中,和用户有关的都在user中。
Flask学习与项目实战4:视图高级之蓝图和子域名、类视图
|
JSON 前端开发 数据格式
Flask学习与项目实战2:url与视图函数映射、视图转url
访问book/list的url的时候发现是不可以访问的,因为我们返回额不是字典、元组等等,现在返回的是一个列表。 TypeError: The view function did not return a valid response. The return type must be a string, dict, tuple, Response instance, or WSGI callable, but it was a list.
Flask学习与项目实战2:url与视图函数映射、视图转url