个人档案URL规则与视图函数

个人档案URL规则与视图函数


Flask 框架学习目录


1. 概述

路由
是MVC架构的Web框架中一定关键的一个定义,也是本节科目标关键。顾名思意,路由就是在恍惚中找出一条路的意趣。在Flask框架中,路由
就代表为用户请求的URL找出其对应的处理函数之意。

个人档案 1

在本节课程,我们将爱护从以下多少个地点讲解Flask框架中的路由:

  • 怎么为使用注册路由?

  • 什么为路由指定其辅助的HTTP方法?

  • 咋样同盟动态URL?

  • 怎样对URL中的变量类型举办过滤?

  • 什么样知道访问点/endpoint?

  • 怎么为运用设定静态路由?

  • 什么防止硬编码指向任何视图的URL?

前些天上马吧。

2. 注册路由

在Flask应用中,路由是指用户请求的URL视图函数时期的照射。Flask框架
依据HTTP请求的URL在路由表中匹配预订义的URL规则,找到相应的视图函数,
并将视图函数的履行结果回到WSGI服务器:

个人档案 2

可见路由表在Flask应用中居于一定宗旨的职位。路由表的内容是由使用开发者填充。

route装饰器
:可以拔取Flask应用实例的route装饰器将一个URL规则绑定到
一个视图函数上。

比如,下边的示范将URL规则/test绑定到视图函数test()上:

@app.route('/test')
def test():
  return 'this is response'

Flask框架就会调用我们的test()函数,其归来结果就传递给WSGI服务器发送给访问者。

add_url_rule()
:另一种等价的写法是应用Flask应用实例的add_url_rule()办法。
上边的演示注册了一个与前例相同的路由:

def test():
  return 'this is response'
app.add_url_rule('/test',view_func=test)

其实,route装饰器内部也是透过调用add_url_rule()方法达成的路由注册。
不过家喻户晓,使用装饰器使代码看起来更优雅一些。

试验代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask 
app = Flask(__name__)

@app.route('/')
def index():
    return '''
    <ur>
        <li><a href="/test">test</a></li>
        <li><a href="/friend">friend</a></li>
    </ur>
    '''

@app.route('/test')
def test():
    return 'this is response'

@app.route('/friend')
def friend():
    return '<h1>My Friend List</h1>'

app.run(host = '0.0.0.0', port = '8080')

实验页面如下:

个人档案 3

个人档案 4

个人档案 5

3. 为路由指定HTTP方法

默许情状下,Flask路由仅辅助HTTP的GET请求。可以应用methods根本字参数,在登记
路由时显式地宣示视图方法帮衬的HTTP方法。

譬如说,下边的示范将URL规则/auth绑定到视图函数v_auth(),这一个路由仅匡助POST方法:

@app.route('/auth', methods = ['POST'])
def v_auth(): pass

3.1 指定多种HTTP方法协理

要害字参数methods的档次为list,由此得以而且指定多种HTTP方法。

上面的演示中,使URL规则/user再就是支持POST方法和GET方法:

@app.route('/user', methods = ['POST', 'GET'])
def v_users():
  if request.method == 'GET':
    return ... # 返回用户列表
  else:
    return ... # 创建新用户

那个特点使Flask卓殊便于开发REST架构的后台服务,而不只局限于传统的动态网页。

试验代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask 
app = Flask(__name__)

@app.route('/')
def index():
    return '''
        <form action="/auth" method="POST">
            <input type="text" name="uid">
            <input type="password" name="pwd">
            <input type="submit" value="submit">
        </form>
    '''
@app.route('/auth',methods=['POST'])
def v_auth():
    return '<h1>在这里做验证工作</h1>'   


app.run(host = '0.0.0.0', port = '8080')

尝试页面如下:

个人档案 6

个人档案 7

4. 匹配动态URL

突发性大家必要将同一类URL映射到同一个视图函数处理,比如,使用同一个视图函数
来体现不相同用户的个人档案。大家愿意以下的URL都足以分发到同一个视图函数:

个人档案 8

在Flask中,可以将URL中的可变部分采取一对小括号<>注明为变量,
并为视图函数注解同名的参数:

@app.route('/user/<uname>')
def v_user(uname):
  return '%s\'s Profile' % uname

在地点的示范中,URL规则中的<uname>意味着这一部分是可变的,Flask将领到用户请求的
URL中那有些的情节,并视作视图函数v_user()uname参数举行调用。

实验代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask 
app = Flask(__name__)

@app.route('/')
def index():
    return '''
    <ur>
        <li><a href = "/user/Mary/friend/Linda">here</a></li>
    </ur>
    '''

@app.route('/user/<uname>/friend/<fname>')
def u_f(uname, fname):
    return '%s\'s friend - %s\'s profile' % (uname, fname)

app.run(host = '0.0.0.0', port = '8080')

试验页面如下:

个人档案 9

个人档案 10

5. URL变量档次过滤

考虑上面的以身作则,我们期望由此HTTP共享文件夹./var/readonly中的文件:

/var
 /readonly
   /a.txt
   /b.txt
   /repo
     /c.txt
     /d.txt

概括思维一下就有答案了。大家得以社团URL规则/file/<fname>,然后径直
读取文件内容重回给用户。注册如下的路由:

@app.route('/file/<fname>')
def v_file(fname):

    fullname = os.path.join('./var/readonly/',fname)
    #print fullname
    f = open(fullname, 'r')
    data = f.readlines()
    f.close()
    return "%s" % data

测试结果申明,/file/a.txt和/file/b.txt都不曾问题,不过/file/repo/c.txt和
/file/repo/d.txt却会破产。

127.0.0.1 - - [03/Nov/2016 20:15:01] "GET /file/a.txt HTTP/1.1" 200 -
127.0.0.1 - - [03/Nov/2016 20:21:18] "GET /file/b.txt HTTP/1.1" 200 -
127.0.0.1 - - [03/Nov/2016 20:21:24] "GET /file/repo/c.txt HTTP/1.1" 404 -

那是因为,默许情状下,在URL规则中的变量被视为不分包/的字符串。/file/repo/c.txt
是没有章程匹配URL规则/file/<fname>的。

可以使用内置的path转换器告诉Flask框架改变这一默许行为。path转换器允许
规则万分包蕴/的字符串:

@app.route('/file/<path:fname>')

在Flask中,转换器/converter用来对从URL中领取的变量举办预处理,这么些进程发生在调用视图函数以前。Flask预置了四种转换器:

  • string – 匹配不带有/的字符串,那是默许的转换器
  • path – 匹配包括/的字符串
  • int – 唯有当URL中的变量是整型值时才匹配,并将变量转换为整型
  • float – 唯有当URL中的变量是浮点值时才匹配,并将变量转换为浮点型

6. 访问点/endpoint

大家一向强调,路由的意义是依据请求的URL,找到呼应的视图函数。那没错,然而在
Flask框架中,请求职务的散发并不是直接从用户请求的URL一步定位到视图函数,
两者之间隔着一个访问点/endpoint

以上边的代码为例,我们看Flask怎么着已毕请求的分发:

@app.route('/home')
def home(): pass

在Flask内部采纳两张表维护路由:

  • url_map :维护URL规则和endpoint的映射
  • view_functions :维护endpoint和视图函数的照耀。

以用户访问URL/home为例,Flask将第一利用url_map找到所请求URL对应的
endpoint,即访问点home,然后再使用view_functions表查找home这几个访问点
对应的视图函数,最终匹配到函数home()

个人档案 11

默许访问点 :当大家使用route装饰器注册路由时,默许使用被点缀函数的
函数名(name)作为访问点,因而,你看来上边的表中,路由中的访问点为home

自定义访问点
:可以在动用route装饰器或调用add_url_rule()办法注册路由时,使用
endpoint重大字参数改变这一默认行为:

@app.route('/home',endpoint='whocare')
def home():pass

那会儿的两张路由表将变成那样:

个人档案 12

7. 静态目录路由

当创制应用实例时,Flask将自行添加一条静态目录路由,其访问点
始终被安装为static,URL规则默许被装置为/static,本地路径默许被
设置为利用文本夹下的static子文件夹:

+------------------------------------------------------------+
| url rule | endpoint | view_function |
|------------------------------------------------------------|
| /static | static | Flask.send_static_file |
+------------------------------------------------------------+

借使你的行使目录如下:

/app
 /web.py
 /static
   /main.css
   /jquery.min.js 

那就是说启动应用后就足以经过URL/static/main.css走访static文件夹下的main.css了。

除去访问点被定位为static,静态目录的URL规则地面目录都是可以根据使用景况展开调整。

转移默认的地面路径
:能够在开创应用对象时利用首要字参数static_folder更改
默认的静态文件夹。例如,你的静态文件都存放在利用下的assets目录下,
那么可以按如下的艺术创设应用对象:

app = Flask(__name__,static_folder='assets')

也可以使用一个相对路径:

app = Flask(__name__,static_folder='/var/www/static')

改变默许的地点路径并不会对路由表暴发潜移默化。

转移默许的URL规则
若是不爱好静态目录URL/static,也足以在创建应用
对象时接纳主要字参数static_url_path换一个其余名字。
上边的示范中,将动用下的assets文件夹注册为静态目录个人档案,/assets

app = Flask(__name__,static_folder='assets',static_url_path='/assets')

当使用运行后,通过URL/assets/main.css就可以访问assets文件夹下的
main.css文件了。

那会儿的路由表变化为:

+------------------------------------------------------------+
| url | endpoint | view_function |
|------------------------------------------------------------|
| /assets | static | Flask.send_static_file |
+------------------------------------------------------------+

8. 构造URL

在一个实用的视图中,不可防止地存在指向任何视图的链接。在事先的学科示例中,我们都是在视图函数中那样硬编码那么些链接URL的:

@app.route('/')
def v_index():
   return '<a href="/tech">tech</a>'
@app.route('/tech') 
def v_tech():pass

多数景况下这种硬编码URL是可以干活的。但假诺那么些利用被挂在WSGI服务器的一个
子路径下,比如:/app1,那么用户访问URL/tech是不会中标的,那时应当走访/app1/tech
才可以正确地路由到视图函数v_tech()

俺们应有采用访问点让Flask框架帮大家总括链接URL。简单地给url_for()函数传入
一个访问点,它回到将是一个保证的URL地址:

@app.route('/')
def v_index():
 print url_for('v_contacts') # /contact
 return 'see console output!'
@app.route('/contact')
def v_contacts():pass

累加查询参数
使用首要字参数,可以在布局的URL中变化查询串。上面的调用将生成
/contact?format=json

@app.route('/')
def v_index():
 print url_for('v_contacts',format='json')
 return ''
@app.route('/contact') 
def v_contacts():pass

添加URL变量
要是指定访问点对应的视图函数接收参数,那么首要字参数将转变对应的参数URL。下边的
示例将生成/contact/Julia?format=html

@app.route('/')
def v_index():
 print url_for('v_contact',name='Julia',format='html')
 return ''
@app.route('/contact/<name>')
def v_contact(name):pass

添加锚点
:使用_anchor关键字可以为浮动的URL添加锚点。上边的言传身教将生成URL
/contact#part2

@app.route('/')
def v_index():
 print url_for('v_contacts',_anchor='part2')
@app.route('/contact')
def v_contacts():pass

外部URL
默许情形下,url_for()生成站内URL,可以安装首要字参数_external
为True,生成包含站点地址的外部URL。上面的示范将生成URLhttp://&lt;x.y.z&gt;/contacts:

@app.route('/')
def v_index():
 print url_for('v_contacts',_external=True)
@app.route('/contact')
def v_contacts():pass

Reference:

flask框架

admin

网站地图xml地图