4-flask-cbv源码、Jinja2模板、请求响应、flask中的session、flask项目参考

[1 flask中cbv源码](#1 flask中cbv源码)
[2 Jinja2模板](#2 Jinja2模板)
[3 请求响应](#3 请求响应)
[4 flask中的session](#4 flask中的session)
[5 flask项目参考](#5 flask项目参考)

1 flask中cbv源码

python 复制代码
***flask的官网文档:***
	https://flask.palletsprojects.com/en/3.0.x/views/

    
1 cbv源码执行流程
	'''
	1 请求来了,路由匹配成功---》执行ItemAPI.as_view('item')()--->view加括号执行
	2 ItemAPI.as_view('item')执行结果:就是View中as_view方法中的闭包函数 view
	3 view()--->执行self.dispatch_request()---》执行MethodView的dispatch_request
	def dispatch_request(self, **kwargs):
	    meth = getattr(self, request.method.lower(), None)
	    return meth(**kwargs)
	4 如果是get请求,就会执行视图类中的get方法
	
	class View:
	    @classmethod
	    def as_view()
	        def view():
	            self.dispatch_request()
	        return view
	'''


2  endpoint 的使用
	app.add_url_rule('/item', endpoint='xxx',view_func=ItemAPI.as_view('item'))
	如果写了endpoint---》别名以它为准,如果不写以as_view的参数为准

3 逻辑:
	1 app.add_url_rule('/item',endpoint='xxx', view_func=ItemAPI.as_view('item'))
	2 endpoint = _endpoint_from_view_func(view_func)
	    如果endpoint没传,就会走这句
	    view_func 是  ItemAPI.as_view('item')  它就是 view
	    
	3 _endpoint_from_view_func(view_func)---》返回了传入的函数的名字
		return view_func.__name__
	
	4 如果上面传入了ItemAPI.as_view('item'),它的函数名就是view---》endpoint就是view


## 总结:
	endpoint如果不传,会以视图函数的函数名作为endpoint
    	-fbv:如果不写endpoint,会以函数名作为endpoint,但是如果多个视图函数加了同一个装饰器,又没有指定endpoint,就会出错了
        -cbv:调用as_view一定要传入一个字符串---》如果endpoint没写,endpoint就是传入的这个字符串,如果写了,这个字符串没用
        
    如果传了,直接以endpoint传入的作为endpoint
    
    
    
### cbv中加装饰器
	1 使用步骤:在类中加入类属性:
        class ItemAPI(MethodView):
            decorators = [装饰器,装饰器2]
            def get(self):
                # print(url_for('xxx'))
                print(url_for('item'))
                return 'get'
	2 
       if cls.decorators:
          for decorator in cls.decorators:
                view = decorator(view)   
                '''
                @装饰器
                def view()
                '''
python 复制代码
### 整个cbv执行流程
# View的as_view
@classmethod
def as_view(cls, name, *class_args, **class_kwargs) :
       def view(**kwargs):
            return self.dispatch_request(**kwargs)

        if cls.decorators:   # 咱们的装饰器
            for decorator in cls.decorators: #每次拿出一个装饰器,
                view = decorator(view) # 装饰器语法糖干的事: 把被装饰的函数当参数传入到装饰器,返回结果赋值给被装饰的函数,一个个用装饰器包装view
        view.__name__ = name
        return view
    

# self.dispatch_request---》MethodView
def dispatch_request(self, **kwargs) :
    # 取到request.method.lower()请求方式小写 ---》假设是get请求get
    # meth是 cbv中 以get命名的方法,反射出来了
    meth = getattr(self, request.method.lower(), None)
    return meth(**kwargs) # 执行cbv中跟请求方式同名的方法
python 复制代码
def register_api(app, model, name):
    item = ItemAPI.as_view(f"{name}-item", model)
    group = GroupAPI.as_view(f"{name}-group", model)
    app.add_url_rule(f"/{name}/<int:id>", view_func=item)  # get put  delete
    app.add_url_rule(f"/{name}/", view_func=group)   #post get 

register_api(app, User, "users")
register_api(app, Story, "stories")

2 Jinja2模板

python 复制代码
# flask使用了Jinja,flask提供了文档,也可以去Jinja官网看
https://flask.palletsprojects.com/en/3.0.x/
https://jinja.palletsprojects.com/en/3.1.x/
    
    
# 总结:之前学过dtl
	-{{变量/简单表达式/函数}}
    -{%if/for %} {%endif%}  {%endfor%}
    -比dtl强大 ,Jinja中可以加括号
    -字典取值,列表取值跟python语言一样,之前dtl 通过 .取值
    -过滤器,标签
    -extends,include 跟之前一样
    

3 请求响应

python 复制代码
# 所有web:请求对象,响应对象(go,java,ptyhon)
	django:request(每个请求一个request),新手四件套
    flask: requset:全局的,但是也是每个请求一个request,新手三件套

# request  全局对象,用起来,跟之前django的一样
        # request.method  请求的方法
        # request.args  get请求提交的数据
        # request.form   post请求提交的数据
        # request.values  post和get提交的数据总和
        # request.cookies  客户端所带的cookie
        # request.headers  请求头
        # request.path     不带域名,请求路径
        # request.full_path  不带域名,带参数的请求路径
        # request.url           带域名带参数的请求路径
        # request.base_url		带域名请求路径
        # request.url_root      域名
        # request.host_url		域名
        # request.host			服务端地址
        # request.files
        # obj = request.files['the_file_name']
        # obj.save('/var/www/uploads/' + secure_filename(f.filename))
        
        
        
        
# 响应 response---》四件套
	-return '字符串'
	-return render_template('index.html',name=lqz,age=19)
	-return redirect(url_for(别名))
	-return jsonify(字典,列表) 

	# 往cookie中写数据--->四件套需要使用
	obj=make_response('index')
    obj.set_cookies()  # 跟之前一样
    
    # obj.headers[]

4 session

python 复制代码
# cookie 机制
# 设置
obj=make_response('index')
obj.set_cookies('name','lqz')
# 取
request.cookie.get('name')


# session机制
	1 设置秘钥
    2 写入session
    session['username']='xxx'
    3 取出session
    username = session.get('username')

5 flask项目参考

python 复制代码
# 开源项目阅读
https://toscode.mulanos.cn/pear-admin/pear-admin-flask
    
# 1 git clone https://toscode.mulanos.cn/pear-admin/pear-admin-flask
# 2 使用pycharm打开
# 3 创建虚拟环境,装依赖
# 4 改配置文件
   MYSQL_USERNAME = "root"
    MYSQL_PASSWORD = "lqz123?"
    MYSQL_HOST = "127.0.0.1"
    MYSQL_PORT = 3306
    MYSQL_DATABASE = "PearAdminFlask"

    # 数据库的配置信息
    # SQLALCHEMY_DATABASE_URI = 'sqlite:///../pear.db'
    SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MYSQL_USERNAME}:{urlquote(MYSQL_PASSWORD)}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}?charset=utf8mb4"
    
    
# 5 创建数据库  PearAdminFlask


# 6 执行初始化
	flask db init
    
#7 migrate.bat
# 8 flask admin init
# 9 启动
run.bat

# 10 改代码---》密码不判断
相关推荐
24kmaigc3 小时前
NewStarCTF2025-ssti在哪里?-ssrf与ssti注入
python·网络安全·flask·web
知识分享小能手4 小时前
Flask入门学习教程,从入门到精通,Flask智能租房——列表页 知识点详解(7)
python·学习·flask
布吉岛的石头5 小时前
Java 程序员第 34 阶段大模型权限与安全设计:接口鉴权与访问控制落地
java·安全·flask
码界筑梦坊6 小时前
153-基于FLask的英国希思罗机场天气数据可视化分析系统
python·信息可视化·数据分析·flask
Lucky_Turtle6 小时前
【Azure】微软云文件存储
microsoft·flask·azure
知识分享小能手1 天前
Flask入门学习教程,从入门到精通,Flask智能租房——首页 知识点详解(6)
python·学习·flask
hzp6661 天前
PyCharm 中开发 Flask 应用时霸占 5000 端口
python·flask
㳺三才人子2 天前
初探 Flask
后端·python·flask·html
小技与小术2 天前
玩转Flask
开发语言·python·flask
知识分享小能手2 天前
Flask入门学习教程,从入门到精通,Flask智能租房——前期准备 知识点详解(5)
python·学习·flask