网站字体大小合适,太原关键词优化报价,团购网站优化,网站关键词写在哪里CBV
1 cbv写法-1 写个类#xff0c;继承MethodView-2 在类中写跟请求方式同名的方法-3 注册路由#xff1a;app.add_url_rule(/home, view_funcHome.as_view(home)) #home是endpoint#xff0c;就是路由别名2 cbv加装饰器-方式一#xff1a;class Home(MethodView):decor…CBV
1 cbv写法-1 写个类继承MethodView-2 在类中写跟请求方式同名的方法-3 注册路由app.add_url_rule(/home, view_funcHome.as_view(home)) #home是endpoint就是路由别名2 cbv加装饰器-方式一class Home(MethodView):decorators [auth] # 之前加载fbv上的直接拿过来用即可-方式二class Home(MethodView):auth # 这个auth需要单独写跟加载fbv上的不一样def get(self):return render_template(home.html)3 允许的请求方式class Home(MethodView):methods [GET] # 控制能够允许的请求方式4 cbv源码5 为什么decorators [auth] 能加装饰器app.add_url_rule(/home, view_funcview内存地址)用装饰器一直在装饰 view内存地址 所以以后执行就是有装饰器的view装饰器代码会走authdef view(**kwargs):return self.dispatch_request(**kwargs)等价于view auth(view)6 view_funcHome.as_view(home) home 是 endpoint就是路由别名-1 app.add_url_rule(/home, view_funcHome.as_view(home))-2 add_url_rule---》endpoint没传---》会执行endpoint _endpoint_from_view_func(view_func)-3 取函数名作为 endpoint 的值-4 view_func是 加了一堆装饰器的view函数---》它的名字应该是装饰器的名字--》但是view.__name__ name # name 就是home-5 所以endpoint就是你传的home-6 如果传了endpoint就是传的那个那as_view(home)就没作用了但是也必须要传
as_view源码 # View的as_view
classmethod
def as_view(cls, name, *class_args, **class_kwargs) :def view(**kwargs):return self.dispatch_request(**kwargs)if cls.decorators: # 咱们的装饰器view.__name__ nameview.__module__ cls.__module__for decorator in cls.decorators: #每次拿出一个装饰器view decorator(view) # 装饰器语法糖干的事 把被装饰的函数当参数传入到装饰器返回结果赋值给被装饰的函数一个个用装饰器包装viewview.__name__ namereturn 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中跟请求方式同名的方法
模板
# 之前dtl中学的所有知识拿到这都可以用---》dtl是django自己的不能独立使用
# jinja2 模板语法第三方flask使用了它它可以单独使用
# jinja2 模板语法 支持括号调用支持 字典[] 取值----》模板中写原来python的语法都支持# jinja2模板语法处理了xss攻击djangojinja2处理xss攻击原理是-使用了html特殊字符的替换把字符串中得 都用特殊字符替换
# extends,include
请求响应
# 所有web:请求对象响应对象(go,java,ptyhon)djangorequest每个请求一个request新手四件套flaskrequset全局的但是也是每个请求一个request新手三件套# flask请求对象全局的request# 请求相关信息# 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))# flask的响应-四件套-1 直接返回字符串-2 返回模板render_template-3 返回重定向redirect,-4返回json格式jsonify-响应中写cookieres make_response(home) res.set_cookie(yyy, yyy, path/home)# 删除cookie# res.delete_cookie(key)-响应头中写内容res make_response(home) # res 就是响应对象res.headers[xxx] xxx
session
# cookie session token# flask中得session没有在服务端存储数据的---》后期扩展可也把session存到redis中# 全局session-放值session[key]value-取值session.get(key)-删除值session.pop(username, None)# session的运行机制django1 生成一个随机字符串2 把数据保存到djagno-session表中3 把随机字符串返回给前端--》当cookie存到浏览器中了--》浏览器再发请求携带cookie过来4 根据随机字符串去表中查---》转到request.session中flask1 把数据加密转成字符串: eyJuYW1lIjoibHF6In0.ZMnbJw.ZUceSaD0kGnU97tu9ZWm3380r002 以cookie形式返回给前端---》保存到浏览器中3 浏览器再发请求携带cookie过来4 加密符串---》解密---》放到session对象中# 源码分析看运行机制-flask默认使用SecureCookieSessionInterface作为session的类-请求来了-客户端带了cookie---》取出cookie 中session对应的值-使用解密方式对它进行解密-放到session对象中-请求走了-把用户放到session中得数据-加密---》转成字符串--》以cookie形式返回给前端-SecureCookieSessionInterface的方法e-open_session请去来了用-save_session请求走了用