Python-类视图和蓝图

简介: Python-类视图和蓝图

一.类视图

在Flask中,可通过视图函数展示视图


http://t.csdnimg.cn/r6IFG


也可基于类实现,类视图的好处是支持继承。标准类视图是继承flask.views模块中基类View的子类


from flask.views import View


该子类中必须重写View类中的dispatch_request()方法。除dispatch_request()方法外,我们也可以根据需要向View子类中添加其他方法或属性。


•methods属性:设置当前类视图可以处理的请求方式列表。


•dispatch_request()方法:用于实现处理不同HTTP请求的具体逻辑,该方法可以通过关键字参数接收URL传递的参数。


•as_view()方法:用于将类转换为实际视图函数。as_view()方法必须传入一个name参数,用于指定生成的视图函数名称,也可以根据需要传入一些关键字参数,这些参数都会转发给类的构造方法,以创建类的实例,并调用类内部的dispatch_request()方法。


如果希望类视图能够对浏览器发送的HTTP请求进行处理,那么需要将类视图与URL建立映射关系。我们需要通过add_url_rule()方法将类视图与URL进行映射,不过该方法的view_func参数不能直接传入类视图的名称,而是需要传入通过as_view()方法将类视图转换后的视图函数。

from flask import Flask
from flask.views import View
class MyView(View):                    # 定义类视图
    def dispatch_request(self, name):# 重写dispatch_request()方法
        return f'hello {name}'
app = Flask(__name__)
# 将类视图与URL规则进行映射
app.add_url_rule('/hello/<name>', view_func=MyView.as_view('myview'))
if __name__ == '__main__':
    app.run()

类视图中通过methods属性设置当前类视图可以处理的请求方式。例如,在上述示例的MyView类中,设置当前类视图处理GET请求和POST请求,并在dispatch_request()方法中添加处理GET请求的具体逻辑。

from flask.views import View
class MyView(View):                                  # 定义类视图
    methods = ['GET', 'POST']                     # 指定请求方式
    def dispatch_request(self, name):         # 重写dispatch_request()方法
        if request.method == 'GET':
            return f'hello {name}'
app = Flask(__name__)
# 将类视图与URL规则进行映射
app.add_url_rule('/hello/<name>', view_func=MyView.as_view('myview'))

基于方法的类视图


在Flask中,基于方法的类视图需要继承flask.views模块中的MethodView类,而MethodView类继承View类


from flask.views import MethodView


由于MethodView类中已经重写了dispatch_request()方法,所以定义基于请求方法的类视图时不需要重写dispatch_request()方法。


-  在基于方法的类视图中,并非通过类属性methods来指定当前视图可以处理的请求方式,而是通过定义与请求方式同名的方法来处理不同的请求。例如,定义一个基于方法的类视图LoginView,之后在该类中添加处理GET请求和POST请求的方法。

from flask import Flask
from flask.views import MethodView
 
class LoginView(MethodView):
    def get(self):                            # 处理GET请求
        return '我负责处理GET请求'
    def post(self):                           # 处理POST请求
        return '我负责处理POST请求'
 
app = Flask(__name__)
 
#基于方法的类视图同样需要使用add_url_rule()方法将类视图与URL规则进行映射,并将通过as_view()方法将类视图转换后的视图函数传入view_func参数。
app.add_url_rule('/login', view_func=LoginView.as_view('login'))
 
if __name__ == '__main__':
    app.run()

案例:

(1)在templates文件夹中添加一个用于展示用户登录页面的模板文件login.html

<body>
    <form action="" method=post>
        <span>用户名:</span><br>
        <input type=text name=username><br>
        <span>密码:</span><br>
        <input type=password name=password><br>
        <p><input type=submit value=登录></p>
    </form>
</body>

(2)在app.py文件中定义与使用基于方法的类视图

from flask.views import MethodView
from flask import Flask, render_template, request
class LoginView(MethodView):
    def get(self):                            # 处理GET请求
        return render_template('login.html')
    def post(self):        # 处理POST请求
        username = request.form.get('username')     # 获取输入的用户名
        password = request.form.get('password')     # 获取输入的密码
        if username =='flask' and password == '123': # 判断用户名和密码是否为123
            return f'用户:{username}登录成功。'
        else:
            return '用户名或密码错误,请重新登录。'
app = Flask(__name__)
app.add_url_rule('/login', view_func=LoginView.as_view('login'))

结果:

二.蓝图

蓝图是一种制作应用程序组件的方式,可以在应用程序内部或跨越多个项目使用。当分配请求时,Flask会将蓝图和视图函数关联起来,并生成两个端点之间的URL。


- 若想在Flask程序中使用蓝图,首先需要创建蓝图,然后再对蓝图进行注册,其中创建蓝图需要通过Blueprint类实现;注册蓝图需要通过register_blueprint()方法实现。


flask.Blueprint(name, import_name, static_folder=None, static_url_path=None, template_folder=None, url_prefix=None, subdomain=None, url_defaults=None, root_path=None, cli_group=<object object>)


•name:必选参数,表示蓝图的名称。


•import_name:必选参数,表示蓝图包的名称,通常为__name__。


•static_folder:可选参数,表示静态文件夹的路径。


•static_url_path:可选参数,表示静态文件的URL。


•template_folder:可选参数,表示模板文件夹路径。


•url_prefix:可选参数,表示附加到所有蓝图URL的路径,用于与Flask应用程序的其他URL区分。


-假设Flask程序包含4个视图函数,分别属于普通用户和管理员两个子模块。如果在该程序中使用蓝图,那么使用蓝图前后的程序结构分别如下图:

在项目的根目录下创建两个py文件,分别是user.py和admin.py,在这两个文件中分别创建user蓝图和admin蓝图

user.py
from flask import Blueprint
# 创建蓝图
user = Blueprint('user', __name__) 
@user.route('/login')                  
def login():
    return 'user_login'
@user.route('/register')                  
def register():
    return 'user_register'
 
 
admin.py
from flask import Blueprint
# 创建蓝图
admin = Blueprint('admin', __name__) 
@admin.route('/login')               
def login():
    return 'admin_login'
@admin.route('/add')
def add():
    return 'admin_add'

- register_blueprint()方法用于将蓝图注册到Flask程序中。


register_blueprint(blueprint, url_prefix, subdomain, url_defaults,**options)


•blueprint:必选参数,表示要注册的蓝图。


•url_prefix:可选参数,表示附加到所有蓝图URL的路径,若在Blueprint类设置参url_prefix,则会被该参数值覆盖。

- 在项目的app.py文件中使用register_blueprint()方法注册user蓝图和admin蓝图。

from admin import admin
from user import user
from flask import Flask
app = Flask(__name__)
app.register_blueprint(admin, url_prefix='/admin')  # 将蓝图admin进行注册
app.register_blueprint(user, url_prefix='/user')        # 将蓝图user进行注册
if __name__ == '__main__':
    app.run()

结果:

目录
相关文章
|
20天前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
3月前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
37 1
|
3月前
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
33 2
|
3月前
|
设计模式 开发者 Python
Python类里引用其他类
Python类里引用其他类
41 4
WK
|
3月前
|
Python
Python类命名
在Python编程中,类命名至关重要,影响代码的可读性和维护性。建议使用大写驼峰命名法(如Employee),确保名称简洁且具描述性,避免使用内置类型名及单字母或数字开头,遵循PEP 8风格指南,保持项目内命名风格一致。
WK
30 0
|
3月前
|
程序员 开发者 Python
深度解析Python中的元编程:从装饰器到自定义类创建工具
【10月更文挑战第5天】在现代软件开发中,元编程是一种高级技术,它允许程序员编写能够生成或修改其他程序的代码。这使得开发者可以更灵活地控制和扩展他们的应用逻辑。Python作为一种动态类型语言,提供了丰富的元编程特性,如装饰器、元类以及动态函数和类的创建等。本文将深入探讨这些特性,并通过具体的代码示例来展示如何有效地利用它们。
69 0
|
3月前
|
Python
Python中的类(一)
Python中的类(一)
25 0
|
3月前
|
Python
Python中的类(一)
Python中的类(一)
21 0
|
3月前
|
Python
Python中的类(二)
Python中的类(二)
27 0
|
3月前
|
开发者 Python
Python类和子类的小示例:建模农场
Python类和子类的小示例:建模农场
24 0