建网站大概多少费用,深圳公司举报网站,自己做的网站怎么发布win7,网战#x1f44f;作者简介#xff1a;大家好#xff0c;我是爱敲代码的小王#xff0c;CSDN博客博主,Python小白 #x1f4d5;系列专栏#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 #x1f4e7;如果文章知识点有错误… 作者简介大家好我是爱敲代码的小王CSDN博客博主,Python小白 系列专栏python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 如果文章知识点有错误的地方请指正和大家一起学习一起进步 如果感觉博主的文章还不错的话请三连支持一下博主哦 博主正在努力完成2023计划中以梦为马扬帆起航2023追梦人 python入门到实战专栏从入门到实战 Python爬虫开发专栏从入门到实战 Python办公自动化专栏从入门到实战 Python数据分析专栏从入门到实战 Python前后端开发专栏从入门到实战 文章目录 模板继承
继承模板实战
add_url_rule与app.route
类视图 类视图的好处 类视图使用场景
基于调度方法的类视图 模板继承 为什么需要模版继承
模版继承可以把一些公用的代码单独抽取出来放到一个父模板中以后子模板直接继承就可以使用了。这样可以重复的利用代码并且以后修改起来也比较方便 模版继承语法
使用 extends 语句来指明继承的父模板。父模板的路径也是相对于 templates 文件夹下的绝对路径
{% extends base.html %}
block语法
一般在父模版中定义一些公共的代码。子模板可能要根据具体的需求实现不同的代码。
这时候父模版就应该有能力提供一个接口让子模板来实现。从而实现具体业务需求的功能。 父模板
{% block block的名字 %}
{% endblock %} 子模板
{% block block的名字 %}
子模板中的代码
{% endblock %}
调用父模版代码block中的代码
默认情况下子模板如果实现了父模版定义的block。那么子模板block中的代码就会覆盖掉父模板中的代码。如果想要在子模板中仍然保持父模板中的代码那么可以使用 {{ super() }} 来实现
父模板
{% block block_body %}p stylebackground-color: blue我是父模版block_body处的内容/p
{% endblock %}
子模板
{% block block_body%}{{ super() }}p stylebackground-color: green我是子模版block_body处的内容/p
{% endblock %}
调用另外一个block中的代码
如果想要在另外一个模版中使用其他模版中的代码。那么可以通过 {{ self.其他block名字() }} 就可以了
{% block title %}txc首页
{% endblock %}
{% block block_body%}{{ self.title() }}p stylebackground-color: green我是子模版block_body处的内容/p
{% endblock %} 注意 1. 子模板中的代码第一行应该是 extends 2. 子模板中如果要实现自己的代码应该放到block中。如果放到其他地方那么就不会被渲染 继承模板实战 实现如下页面需要使用
1、模板继承 2、引入静态资源 add_url_rule与app.route add_url_rule
add_url_rule(rule,endpointNone,view_funcNone)
这个方法用来添加url与视图函数的映射。如果没有填写 endpoint 那么默认会使用 view_func 的名字作为 endpoint 。以后在使用 url_for 的时候就要看在映射的时候有没有传递 endpoint 参数如果传递了那么就应该使用 endpoint 指定的字符串如果没有传递那么就应该使用 view_func 的名字。
def my_list():return 我是列表页app.add_url_rule(/list/,endpointsxt,view_funcmy_list)
app.route原理剖析
这个装饰器底层其实也是使用 add_url_rule 来实现url与视图函数映射的。
from flask import Flask,url_forapp Flask(__name__)app.route(/,endpointindex)
def index():print(url_for(show))print(url_for(index))return Hellodef show_me():return 这个介绍信息# endpoint 没有设置url_for中就写函数的名字如果设置了就写endpoint的值
app.add_url_rule(/show_me,view_funcshow_me,endpointshow)
# app.route 底层就是使用的 add_url_ruleif __name__ __main__:app.run(debugTrue) 类视图 之前我们接触的视图都是函数所以一般简称函数视图。其实视图也可以基于类来实现类视图的好处是支持继承但是类视图不能跟函数视图一样写完类视图还需要通过app.add_url_rule(url_rule,view_func) 来进行注册 标准类视图使用步骤 1. 标准类视图必须继承自 flask.views.View 2. 必须实现 dispatch_request 方法以后请求过来后都会执行这个方法。 这个方法的返回值就相当于是之前的视图函数一样。也必须返回 Response 或者子类的对象或者是字符串或者是元组。 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__)app.route(/)
def index():# print(url_for(mylist))print(url_for(my))return Helloclass ListView(View):def dispatch_request(self):return 返回了一个List的内容
#app.add_url_rule(/list,view_funcListView.as_view(mylist))app.add_url_rule(/list,endpointmy,view_funcListView.as_view(mylist))# 用于测试
with app.test_request_context():print(url_for(my))if __name__ __main__:app.run(debugTrue) 类视图的好处 1.可以继承把一些共性的东西抽取出来放到父视图中子视图直接拿来用就可以了。 2.但是也不是说所有的视图都要使用类视图这个要根据情况而定。视图函数用得最多。
from flask import Flask,jsonify
from flask.views import Viewapp Flask(__name__)# 需求返回的结果都必须是json数据
class BaseView(View):def get_data(self):raise NotImplementedErrordef dispatch_request(self):return jsonify(self.get_data())class JsonView(BaseView):def get_data(self):return {uname:吕布,age:20}class Json2View(BaseView):def get_data(self):return [{name:艾派徳,lua:Python},{name:程序员,lua:Python},]app.add_url_rule(/base,view_funcBaseView.as_view(base))
app.add_url_rule(/json,view_funcJsonView.as_view(json))
app.add_url_rule(/json2,view_funcJson2View.as_view(json2))if __name__ __main__:app.run(debugTrue) 类视图使用场景
from flask import Flask,render_template
from flask.views import Viewapp Flask(__name__)class BaseView(View):def __init__(self):self.msg {main:又更新了123}class LoginView(BaseView):def dispatch_request(self):my_msg 神奇的登录功能self.msg[my_msg] 神奇的登录功能# return render_template(login.html,msg self.msg.get(main),my_msg my_msg)return render_template(login.html,**self.msg)class RegisterView(BaseView):def dispatch_request(self):self.msg[my_msg] 快捷的注册功能# return render_template(register.html,msg self.msg.get(main),my_msg my_msg)return render_template(register.html,**self.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(debugTrue)
基于调度方法的类视图 1. 基于方法的类视图是根据请求的 method 来执行不同的方法的。如果用户是发送的 get 请求那么将会执行这个类的 get 方法。
如果用户发送的是 post 请求那么将会执行这个类的 post 方法。其他的method类似比如 delete 、 put 2. 这种方式可以让代码更加简洁。所有和 get 请求相关的代码都放在 get 方法中所有和 post 请求相关的代码都放在 post 方法中。就不需要跟之前的函数一样通过 request.method GET
案例
HTML
form action/login/ methodposttabletrtd账号/tdtdinput typetext nameuname/td/trtrtd密码/tdtdinput typepassword namepwd/td/trtrtd/tdtdinput typesubmit value立即登录/td/trtrtd colspan2{# font colorred{{ error }}/font#}{# 优化写法 判断 #}{% if error %}font colorred{{ error }}/font{% endif %}/td/tr/table
/form
python
#定义一个基于方法调度的 类视图
class LoginView(views.MethodView):def get(self):return render_template(login.html)def post(self):#模拟实现#拿到前端页面传过来的 账号 和密码 去数据库做查询操作 查询到 (跳转主页面) ,反之跳转到login.html页面并给出错误提示信息uname request.form[uname]pwd request.form[pwd]if unameaps and pwd 123:return render_template(index.html)else:return render_template(login.html,error用户名或者密码错误)# 注册类视图
app.add_url_rule(/login/,
view_funcLoginView.as_view(my_login))
改进1
class LoginView(views.MethodView):def get(self,errorNone):return render_template(login.html,errorerror)def post(self):#模拟实现#拿到前端页面传过来的 账号 和密码 去数据库做查询操作 查询到 (跳转主页面) ,反之跳转到
login.html页面并给出错误提示信息uname request.form[uname]pwd request.form[pwd]if unameaps and pwd 123:return render_template(index.html)else:return self.get(error用户名或者密码错误)# 注册类视图
app.add_url_rule(/login/,view_funcLoginView.as_view(my_login))
改进2
基于调度方法的类视图, 通常get()方法处理get请求,post()方法处理 post请求,
为了便于管理,不推荐post方法和get方法互相调用
class LoginView(views.MethodView): def __jump(self,errorNone): return render_template(login.html, errorerror) def get(self, errorNone): return self.__jump() def post(self): # 模拟实现 #拿到前端页面传过来的 账号 和密码 去数据库做查询操作 查询到 (跳转主页面) ,反之跳转到
login.html页面并给出错误提示信息 uname request.form[uname] pwd request.form[pwd] if uname sxt and pwd 123:return render_template(index.html) else: return self.__jump(error用户名或者密码错误)# 注册类视图app.add_url_rule(/login/,view_funcLoginView.as_view(my_login))