Flask之视图高级(一)

简介: Flask之视图高级(一)

add_url_rule与app.route


add_url_rule与app.route都是flask为我们建立路由的方式,两者实现的功能是一样的。


add_url_rule的使用


首先是语法:

add_url_rule(rule,endpoint=None,view_func=None)

一共是三个参数:relu、endpoint、view_func,其中rule(path)、view_func是必须填写的参数。不填写endpoint则会默认使用view_func的名字作为endpoint。

from flask import Flask,url_for
app = Flask(__name__)
def show_me():
    return '这是自我介绍!'
# endpoint 中没有设置url_for 就写函数的名字,如果设置了就写endpoint
app.add_url_rule('/show_me',view_func=show_me,endpoint='show')
if __name__ == '__main__':
    app.run(debug=True)

在使用url_for 时,如果没有传递endpoint参数的时候,就使用view_func的名字,如果传递了endpoint参数,则应该使用endpoint指定的字符串。


@app.route


关于@app.route平时我们都是用这个吧,其底层原理其实就是使用的 add_url_rule ,对其进行了封装做成了装饰器,一样可以使用endpoint参数。

from flask import Flask,url_for
app = Flask(__name__)
@app.route('/',endpoint='index')
# @app.route  底层就是使用的 add_url_rule ,对其进行了封装做成了装饰器。
def index():
    print(url_for('index'))
    return 'hello'
if __name__ == '__main__':
    app.run(debug=True)

类视图


优点:支持继承


缺点:写完类视图,还需要通过 add_url_rule 来进行注册。


标准类视图使用步骤


1. 标准类视图,必须继承自flask.views.View


2. 必须实现dispatch_request方法。


3. 必须通过app.add_url_rule(rule,endpoint,view_func)来做url与视图的映射。view_func这个参数,需要使用类视图下的as_view类方法类转换:ListView.as_view('list')


4. 如果指定了endpoint,那么在使用url_for反转的时候就必须使用endpoint指定的那个值。如果没有指定endpoint,那么就可以使用as_view(视图名字)中指定的视图名字来作为反转。

from flask import Flask,url_for
from flask.views import View
app = Flask(__name__)
class ListView(View):
    def dispatch_request(self):
        return '返回了一个List的内容。'
app.add_url_rule('/List',view_func=ListView.as_view('mylist'))
#用于测试
with app.test_request_context():
    print(url_for('mylist'))
if __name__ == '__main__':
    app.run(debug=True)

类视图的优点


前面也说,支持继承,可以把一些共性的东西提取出来放到父视图中去,子视图可以直接调用。但是并非所有视图都要用类视图,视图函数用的最多。


例:

from flask import Flask,jsonify
from flask.views import View
app = Flask(__name__)
# 需求:返回的结果必须是json数据
class BaseView(View):
    def get_data(self):
        raise NotImplementedError
    def dispatch_request(self):
        return jsonify(self.get_data())
class JsonView(BaseView):
    def get_data(self):
        return {'uname':'xiaolin','age':20}
class Json2View(BaseView):
    def get_data(self):
        return [
            {'name':'xiaowang','age':19},
            {'name':'xiaoyu','age':19},
        ]
app.add_url_rule('/base',view_func=BaseView.as_view('base'))
app.add_url_rule('/json',view_func=JsonView.as_view('json'))
app.add_url_rule('/json2',view_func=Json2View.as_view('json2'))
if __name__ == '__main__':
    app.run(debug=True)

我们可以看到子视图jsonview和json2view继承了baseview,而baseview中已经重写了dispatch_request(),所以在继承后也不用再次重写该内容。


类视图的实战


在网页大部分登录页面和注册页面,只改变了一小部分东西,大部分的东西是共通的,页面上的内容基本上是相同的,但是却是两个不同的网页,这时候类视图的继承就会减轻了绝大部分的重复的代码。


py:

from flask import Flask,render_template
from flask.views import View
app = Flask(__name__)
class BaseView(View):
    def __init__(self):
        self.msg = {
            'main':'你好!!'
        }
class LoginView(BaseView):
    def dispatch_request(self):
        my_msg = '登录功能'
        return render_template('login.html',msg = self.msg.get('main'),my_msg = my_msg)
class RegisterView(BaseView):
    def dispatch_request(self):
        my_msg = '注册功能'
        return render_template('register.html',msg = self.msg.get('main'),my_msg = my_msg)
app.add_url_rule('/login',view_func=LoginView.as_view('login'))
app.add_url_rule('/register',view_func=RegisterView.as_view('register'))
if __name__ == '__main__':
    app.run(debug=True)

login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录页面</title>
</head>
<body>
    <h2>登录页面</h2>
    <table>
        <tr>
            <td>用户名:</td>
            <td><input type="text"></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password"></td>
        </tr>
        <tr>
            <td>登录</td>
            <td><input type="submit" , value="登录"></td>
        </tr>
    </table>
    <hr>
    公共的内容:{{ msg }}
    <hr>
    个人的内容:{{ my_msg }}
</body>
</html>

register.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>注册页面</title>
</head>
<body>
    <h2>注册页面</h2>
    <table>
        <tr>
            <td>用户名:</td>
            <td><input type="text"></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password"></td>
        </tr>
        <tr>
            <td>登录</td>
            <td><input type="submit" , value="登录"></td>
        </tr>
    </table>
    <hr>
    公共的内容:{{ msg }}
    <hr>
    个人的内容:{{ my_msg }}
</body>
</html>

效果图展示:

555.png

666.png

--------------------------------------------------------------------------------------------------------------------------------


End

相关文章
|
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应用开发提供了基础。
|
9月前
|
JSON 安全 数据格式
Flask 高级应用:使用蓝图模块化应用和 JWT 实现安全认证
本文将探讨 Flask 的两个高级特性:蓝图(Blueprints)和 JSON Web Token(JWT)认证。蓝图让我们可以将应用模块化,以便更好地组织代码;而 JWT 认证是现代 Web 应用中常见的一种安全机制。
|
9月前
|
Python
【flask】URL和视图映射
【flask】URL和视图映射
37 0
|
9月前
|
搜索推荐 Apache Python
Flask | Flask基础 - URL与视图
Flask | Flask基础 - URL与视图
|
10月前
|
存储 数据库 Python
Flask高级(四)
Flask高级(四)
|
10月前
|
算法 开发者 Python
Flask高级(三)
Flask高级(三)
|
10月前
|
Python
Flask高级(二)
Flask高级(二)
|
10月前
|
Web App开发 存储 安全
Flask高级(一)
Flask高级(一)
|
10月前
|
Linux 定位技术 调度
Flask之视图高级(二)
Flask之视图高级(二)