Flask 视图的高级技术

本文详细介绍了Flask框架中的关键概念,包括app.route和add_url_rule的用法,展示了如何注册视图函数和URL的绑定。接着探讨了Flask的类视图,包括标准类视图和基于调度方法的类视图,强调了类视图的继承优势。最后,文章阐述了蓝图的概念,解释了蓝图如何帮助实现模块化的视图函数组织,并给出了创建分路由视图函数的示例。
摘要由CSDN通过智能技术生成

 

1.app.route和add_url_rule 的简介

说明:

在Flask中,路由是用户指定请求的URL与视图函数之间映射,处理url和函数之间的关系称之为路由,Flask根据HTTP请求的URL在路由表中匹配预定义的URL规则,找到对应的视图函数,并将视图函数执行的结果返回给服务器。

1.app.route()的使用

示列:

@app.route('/')
def hello_world():
     return render_template('base.html')

2.add_url_rule()的使用

from flask import Flask
app=Flask(__name__)
@app.route('/')
def index1():
    return '我是地球人'
def hello_word():
    return '我是火星人'
app.add_url_rule('/test/',endpoint='my_test',view_func=hello_word)
if __name__ == '__main__':
    app.run(debug=True)

解析:使用app.add_url_rule()函数进行视图函数和URL的绑定,这里将路由‘/test/’和视图函数‘hello_word()’函数进行了绑定。

  • rule:设置的URL
  • endpoint:给URL设置的名称
  • view_func:指定视图函数的名称

注意:Flask是通过endpoint找到viewfunction视图函数的。

 

2.Flask 类视图 

说明:视图函数也可以基于来实现,类视图的好处是支持继承,编写完类视图需要通过app.add_url_rule(url_rule,view_func)来进行注册。Flask类视图分为标准类视图和基于调度方法的类视图。

1.标准类视图

标准类视图的特点:

  • 必须继承flask.views.View。
  • 必须实现dispatch_reuquest 方法,以后请求过来后,都会执行这个方法,这个方法的返回值相当于之前的视图函数,也必须返回Response 或者子类的对象,或者是字符串和元组。
  • 必须通过app.add_url_rule(rule,endpoint,view_func)来做url与视图函数的映射,view_func参数需要使用as_view类方法转换
  • 如果指定了endpoint,那么url_for反转时候要必须通过endpoint指定的那个值,如果没有指定endpoint,那么就可以使用as_view视图名称中指定的视图名称来做为反转。

注意:

使用类视图的好处是支持继承,可以把一些共性的东西放在父类,其他子类可以继承,但是类视图不能和视图函数一样,写完类视图西药使用app.add_url_rule()进行注册。

示列:

from flask import Flask,render_template,views
app=Flask(__name__)
class Ads(views.View):
    def __init__(self):
        super(Ads, self).__init__()
        self.dicks={
            'ads':'这是对联广告'
        }

class index2(Ads):
    def dispatch_request(self):
        return render_template('login.html',**self.dicks)

class index3(Ads):
    def dispatch_request(self):
        return render_template('name.html',**self.dicks)

class index4(Ads):
    def dispatch_request(self):
        return render_template('hello.html',**self.dicks)

app.add_url_rule(rule='/',endpoint='test',view_func=index2.as_view('index2'))
app.add_url_rule(rule='/in/',endpoint='tests',view_func=index3.as_view('index3'))
app.add_url_rule(rule='/is/',endpoint='testa',view_func=index4.as_view('index4'))
if __name__ == '__main__':
    app.run(debug=True)

创建的HTML文档

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
这是首页 {{ ads }}
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
这是登录页面 {{ ads }}
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
这是注册页面 {{ ads }}
</body>
</html>

基于方法的类视图

说明:

Flask提供了另外一种视图flask.views.MethodView,对每个HTTP方法执行不同的函数(映射到对应方法的小写的同名方法上)。

from flask import Flask,render_template,views,request
app=Flask(__name__)
@app.route('/',methods=['get','post'])
def fun():
    return render_template('hello.html')
class Ads(views.MethodView):
    def get(self):
        return render_template('hello.html')
    def post(self):
        username=request.form.get('username')
        password=request.form.get('password')
        if username == 'adin' and password == 'adin':
            return '用户名正确可以登录'
        else:
            return '用户名或者密码错误重新登录'
app.add_url_rule('/login',view_func=Ads.as_view('Ads'))
if __name__ == '__main__':
    app.run(debug=True)

创建一个HTML文档

<form action="/login" method="post">
用户名<input name="username"type="text">
  密码<input name="password" type="password">
  登录<input name="denglu"type="submit"value="登录">
</form>

注意:类中的get方法和post 方法不能改名字,是重写。

3.蓝图

说明:

蓝图的定义,在蓝图被注册到应用之后,所要执行的操作集合,当分配请求时,Flask会把蓝图和视图函数关联起来。并生成两个端点之前的URL

示列:

from flask import Flask,render_template,views,request
import news,proect
app=Flask(__name__)
@app.route('/')
def hello_word():
    return  'hello my word'
app.register_blueprint(news.news_list)   #将News模块里面的蓝图对象news_list注册到app
app.register_blueprint(proect.proect)    #将proect模块里面的蓝图对象proect注册到app
if __name__ == '__main__':
    app.run(debug=True)

创建一个分路由视图函数

from flask import Blueprint
news_list=Blueprint('news',__name__)  
"""
创建一个Blueprint对象,第一个参数可以看成是这个对象的名字。
"""
@news_list.route('/news')    #将蓝图对象当作app那样使用
def new():
    return '这是一个模块页面'

创建一个分路由视图函数 


from flask import Blueprint
proect=Blueprint('txt',__name__)
@proect.route('/txt')
def pro():
    return '这又是另外一个模块'

解析:蓝图的目的是实现各个模块的视图函数写在不同的py.文件中,在主视图中导入分路由视图模块,并且注册成蓝图对象。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值