Python Web - Flask笔记4

26. add_url_ruleapproute原理解析

add_url_rule(rule,endpoint=None,view_func=None)

这个方法用来添加url与视图函数的映射。如果没有填写endpoint,那么默认会使用view_func的名字作为endpoint。以后在使用url_for的时候,endpoint可以不写,如果不写,则默认使用视图函数的名字

def my_list():
    return 'list'

app.add_url_rule('/list/', endpoint='xxx', view_func=my_list)

此处的endpoint用于url_for(),当添加自定义规则后,必须使用endpoint定义的名称才可以访问。

@app.route('/', endpoint='index')
def index():
    return redirect(url_for('xxx'))

否则报错:werkzeug.routing.BuildError

app.route(rule,**options)装饰器:

这个装饰器底层,其实也是使用add_url_rule来实现url与视图函数映射的。

27. 类视图

标准类视图:

  1. 标准类视图,必须继承自flask.views.View.
  2. 必须实现dipatch_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(视图名字)中指定的视图名字来作为反转。
  5. 类视图有以下好处:可以继承,把一些共性的东西抽取出来放到父视图中,子视图直接拿来用就可以了。但是也不是说所有的视图都要使用类视图,这个要根据情况而定。
class ListView(View):
    def dispatch_request(self):
        return 'list view'

# ListView.as_view('list') 把类转为函数,并添加函数名
app.add_url_rule('/list/', endpoint='list', view_func=ListView.as_view('list'))

@app.route('/')
def index():
    return redirect(url_for('list'))

基于请求方法的类视图:

  1. 基于方法的类视图,是根据请求的method来执行不同的方法的。如果用户是发送的get请求,那么将会执行这个类的get方法。如果用户发送的是post请求,那么将会执行这个类的post方法。其他的method类似,比如deleteput
  2. 这种方式,可以让代码更加简洁。所有和get请求相关的代码都放在get方法中,所有和post请求相关的代码都放在post方法中。就不需要跟之前的函数一样,通过request.method == 'GET'
class LoginView(MethodView):
    def get(self):
        return render_template('login.html')

    def post(self):
        username = request.form.get('username')
        pwd = request.form.get('pwd')
        return "%s, %s" % (username, pwd)

app.add_url_rule('/login/', view_func=LoginView.as_view('login'))

类视图中的装饰器:

  1. 如果使用的是函数视图,那么自己定义的装饰器必须放在app.route下面。否则这个装饰器就起不到任何作用。
  2. 类视图的装饰器,需要重写类视图的一个类属性decorators,这个类属性是一个列表或者元组都可以,里面装的就是所有的装饰器。
class ListView(View):
    decorators = [xxx, xxx]
    def dispatch_request(self):
        return 'list view'
app.add_url_rule('/list/', view_func=ListView.as_view('list'))
  1. 蓝图的基本使用

蓝图的作用就是让我们的Flask项目更加模块化,结构更加清晰。可以将相同模块的视图函数放在同一个蓝图下,同一个文件中,方便管理。

28.1 基本语法:

在蓝图文件中导入Blueprint:

from flask import Blueprint
user_bp = Blueprint('user', __name__, url_prefix='/user')

url_predix后面不要加/如果加了,之后的视图路由名称之前不要加/

在主app文件中注册蓝图:

from blueprints.user import user_bp
app.regist_blueprint(user_bp)

如果想要某个蓝图下的所有url都有一个url前缀,那么可以在定义蓝图的时候,指定url_prefix参数:

user_bp = Blueprint('user',name,url_prefix='/user/')

在定义url_prefix的时候,要注意后面的斜杠,如果给了,那么以后在定义url与视图函数的时候,就不要再在url前面加斜杠了。

之后访问域名: 127.0.0.1:5000/user/xxx

  1. 蓝图模版文件的查找: 如果项目中的templates文件夹中有相应的模版文件,就直接使用了。 如果项目中的templates文件夹中没有相应的模版文件,那么就到在定义蓝图的时候指定的路径中寻找。并且蓝图中指定的路径可以为相对路径,相对的是当前这个蓝图文件所在的目录。比如: news_bp = Blueprint('news',__name__,url_prefix='/news',template_folder='bp_templates') 这里模板文件的相对路径是相对蓝图文件的路径,这里蓝图文件路径在blueprints中所以,最终该蓝图模板文件在项目目录下的blueprints目录下的bp_templates中 因为这个蓝图文件是在blueprints/news.py,那么就会到blueprints这个文件夹下的bp_templates文件夹中寻找模版文件。
  2. 蓝图中静态文件的查找规则: 在模版文件中,加载静态文件,如果使用url_for(‘static’),那么就只会在app指定的静态文件夹目录下查找静态文件。 如果在加载静态文件的时候,指定的蓝图的名字,比如news.static,那么就会到这个蓝图指定的static_folder下查找静态文件。
  3. url_for反转蓝图中的视图函数为url: 如果使用蓝图,那么以后想要反转蓝图中的视图函数为url,那么就应该在使用url_for的时候指定这个蓝图。比如news.news_list。否则就找不到这个endpoint。在模版中的url_for同样也是要满足这个条件,就是指定蓝图的名字。 即使在同一个蓝图中反转视图函数,也要指定蓝图的名字。

蓝图实现子域名:

  1. 使用蓝图技术。
  2. 在创建蓝图对象的时候,需要传递一个subdomain参数,来指定这个子域名的前缀。例如:cms_bp = Blueprint('cms',__name__,subdomain='cms')
  3. 必需要在主app文件中,需要配置app.config的SERVER_NAME参数。例如: app.config['SERVER_NAME'] = 'test.com:5000'
    • ip地址不能有子域名。
    • localhost也不能有子域名。
  4. C:\Windows\System32\drivers\etc下,找到hosts文件,然后添加域名与本机的映射。例如: 127.0.0.1 test.com 127.0.0.1 test.jd.com 域名和子域名都需要做映射。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的碎碎念

ThinkPHP page分页类的学习

实例化数据对象 1.$user=M('user'); 查询总记录数 $count = $user->count();//直接读取数据表中条项总数 ...

4145
来自专栏LanceToBigData

JavaWeb(一)Servlet中乱码解决与转发和重定向的区别

前言   前面其实已经把Servlet中所有的内容都介绍完了,这篇讲补充一点乱码和重定向与转发之间的区别! 一、request请求参数出现乱码问题 1.1、ge...

28510
来自专栏锦小年的博客

python学习笔记5.3-包的创建

包,也可以称为库,是具有很多功能的一个集合体。本文主要介绍如何自己创建一个包,以及介绍一些在包的创建过程中的技巧。 1. 包的创建 本文的例子将使用最复杂的情况...

2568
来自专栏魏琼东

基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET - 插件接口IModule

  我们知道,要基于平台(容器)+插件的这种模式进行开发,我们必须定义一组契约,用于约束模块插件开发,也就是说,模块插件需要遵守一定的标准进行开发,才能正常被容...

2347
来自专栏Petrichor的专栏

python: os 库

2582
来自专栏软件开发 -- 分享 互助 成长

java入门

一、java的运行机制 高级语言的运行机制主要有编译型和解释型两种。 C/C++属于编译型语言,由专门的编译器针对特定的操作系统平台进行翻译,生成可执行代码,特...

19710
来自专栏专注 Java 基础分享

线程的基本概念

按照规划,从本篇开始我们开启『并发』系列内容的总结,从本篇的线程开始,到线程池,到几种并发集合源码的分析,我们一点点来,希望你也有耐心,因为并发这块知识是你职业...

1142
来自专栏电光石火

给博客添加节日雪花

二话不说先上效果图: ? 需要的朋友请看下面的说明,对JQ比较了解的朋友可以直接下载。 下载地址:jQuery圣诞下雪花.rar 注意事项 ...

2217
来自专栏python成长之路

(汇总)os模块以及shutil模块对文件的操作

1355
来自专栏程序员同行者

Python sys os getpass 包的导入

1311

扫码关注云+社区

领取腾讯云代金券