Flask入门二(Flask的CBV、模版语法、请求和响应、session执行流程分析、Flask闪现、请求拓展、g对象、蓝图、导出Flask项目依赖)

本文围绕Flask后端开发展开,介绍了Flask的CBV写法、执行流程等,还阐述了模版语法、请求和响应、session执行流程、Flask闪现等内容。同时讲解了请求扩展、g对象、BluePrint蓝图的使用,最后提及导出Flask项目依赖。

一、Flask的CBV

1.CBV的写法

from flask import Flask
app = Flask(__name__)
app.debug = True

# FBV的写法
@app.route('/')
def index():
    return 'hello'


# CBV的写法
from flask.views import MethodView
class TestView(MethodView):
    def get(self):
        return '我是get'

    def post(self):
        return '我是post'

# 注册路由
# as_view必须加一个字符串---》是路由的别名
# endpoint 和 as_view(name= 路由别名),以谁为准?
# 读源码后,知道了,以 endpoint 为准
# 如果endpoint 没传--》endpoint是 view_func.__name__ 视图函数的名字 ,别名就是函数名
# 如果endpoint 没传,as_view(name= 路由别名)也没传---》去视图函数名字-->视图函数都是:view
# as_view(name= 路由别名) 有什么用? 把view的名字改为了,你传入的字符串名
app.add_url_rule('/test', 'test', TestView.as_view('test'))


if __name__ == '__main__':
    app.run()

在这里插入图片描述

2.CBV的执行流程

	'从上面CBV的写法来查看执行流程'
	1.app.add_url_rule('/test', 'test', TestView.as_view('test'))
		-这个注册路由的第三个参数,放视图函数的内存地址,也就是TestView.as_view('test') 是函数内存地址
		
	2.所以我们需要在TestView中找类的方法as_view
		-已知我们自己写的TestView中没有写这个方法,所以得去继承的MethodView中寻找,最后在MethodView继承的View中找到了
		
		@classmethod  '把源码精简一下'
	    def as_view(cls, name,*class_args, **class_kwargs):
	        def view(**kwargs):
	        	'这里是把它放到异步函数中操作,本质就是return了self.dispatch_request(**kwargs)'
	            return current_app.ensure_sync(self.dispatch_request)(**kwargs)
	        return view
	        
	3.app.add_url_rule的第三个位置,也就是as_view,放的就是View的内层函数

	4.当请求来了的时候,路由匹配成功,就会执行view(参数),本质上就是执行self.dispatch_request(**kwargs)

	5.所以我们要去找dispatch_request方法,我们视图类中没有,那么去父类MethodView中寻找,结果找到了
	'这个就跟我们Django中的CBV一样了'
		'然后看到self.dispatch_request中方法 ,在当前视图类中反射,请求方式的小写字符串(get,post),如果我们写了这些方法 就会去执行。'
	    def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue:
	        # request.method.lower() 请求方式变小写
	        # self是视图类的对象
	        # 去视图类的对象中反射跟请求方式同名的方法 假设是get方法
	        meth = getattr(self, request.method.lower(), None)
	        if meth is None and request.method == "HEAD":
	            meth = getattr(self, "get", None)
	        assert meth is not None, f"Unimplemented method {
     
     request.method!r}"
	        # get(传入参数)
	        return meth(**kwargs)  

3.endpoint 的使用

	1.如果写了endpoint,别名以它为准,如果不写以as_view的参数为准
	app.add_url_rule('/test', endpoint='xxx',view_func=TestView.as_view('test'))
	
	'逻辑:'
	1 app.add_url_rule('/test',endpoint='xxx', view_func=TestView.as_view('test'))
	
	2 endpoint = _endpoint_from_view_func(view_func)
		如果endpoint没传也就是None,就会走这句 view_func是TestView.as_view('test')  它就是函数名
		if endpoint is None:
            endpoint = _endpoint_from_view_func(view_func)	# view_func.__name__
        options["endpoint"] = endpoint		# 如果都是endpoint就会冲突
        
	3 _endpoint_from_view_func(view_func)---》返回了传入的函数的名字
		return view_func.__name__
		# 如果没有其他更改--->所有cbv的函数内存地址都是view
	
	4 如果上面传入了TestView.as_view('test'),它的函数名就是view---》endpoint就是view
		-view.__name__ = name
	    -view的名字 是咱么  TestView.as_view('名字') 传入的名字,不再是view了
	
	'总结:'
	endpoint如果不传,会以视图函数的函数名作为endpoint
    	-fbv:如果不写endpoint,会以函数名作为endpoint,但是如果多个视图函数加了同一个装饰器,又没有指定endpoint,就会出错了
        -cbv:调用as_view一定要传入一个字符串---》如果endpoint没写,endpoint就是传入的这个字符串,如果写了,这个字符串没用
        
    如果传了,直接以endpoint传入的作为endpoint


	TestView.as_view(name='index'),name到底有啥用
		app.add_url_rule('/test', view_func=TestView.as_view('test'))
	   	没有传endpoint,Login.as_view('login')是view函数的内存地址
	       endpoint会以函数名作为endpoint的值,现在所有函数都是view,必须传入name,来修改调view函数的名字
	       如果传了endpoint,别名以endpoint为主,如果不传endpoint,别名以name为主
	       app.add_url_rule('/test', view_func=TestView.as_view(name='test'),endpoint='xxx')

4.CBV中得methods作用

	视图类中有个属性就是methods = ['GET', 'POST']
	用来控制允许的请求方式 写了什么方法 就允许什么请求 若没有写则不能使用该方法

5.CBV加装饰器

	1 使用步骤:在类中加入类属性:
	class UserView(MethodView):
	    decorators = [装饰器1,装饰器2] # 先写的装饰器放在最内部(最左边),是最后执行的装饰器
	    def get(self):
            return 'get'
	
	    def post(self):
	        return 'post'
	
	2.我们在as_view源码中可以看到
    if cls.decorators:
        view.__name__ = name
        view.__module__ = cls.__module__
         # 这就是装饰器的本质原理
        '循环拿出,然后使用装饰器来执行被装饰函数,然后在把执行的赋值给被装饰函数'
        for decorator in cls.decorators:
            view = decorator(view)

二、模版语法

1.渲染变量

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户列表</h1>
    <table>
        {
   
   % for k,v in user_dict.items() %}
        <tr>
            <td>{
   
   {
   
   k}}</td>
            <td>{
   
   {
   
   v.name}}</td>
            <td>{
   
   {
   
   v['name']}}</td>
            <td>{
   
   {
   
   v.get('name')}}</td>
            <td><a href="/detail/{
   
   {k}}">查看详细</a></td>
        </tr>
        {
   
   % endfor %}
    </table>
</body>
</html>

2.变量的循环

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户列表</h1>
    <table>
        {
   
   % for k,v 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值