原文链接: python3 flask 路由

上一篇: Python3 requests 添加 cookie

下一篇: python 运行 linux 命令

from flask import Flask, request, url_forapp = Flask(__name__)@app.route("/")
def index():# print(uid)c = request.cookiesprint(request.remote_user)print(request.remote_addr)print(c)print(url_for("urlforfun"))return url_for("urlforfun")return "index"@app.route("/urlfor")
def urlforfun():return "urlfor"app.run(port=80)

使用url_for 指定的url是已经加入映射的函数名

4. 匹配动态URL

有时我们需要将 同一类 URL映射到 同一个 视图函数处理,比如,使用同一个视图函数 来显示不同用户的个人档案。我们希望以下的URL都可以分发到同一个视图函数:

在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')

实验页面如下:

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 fullnamef = 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()

默认访问点 :当我们使用 route 装饰器注册路由时,默认使用被装饰函数的 函数名( name )作为访问点,因此,你看到上面的表中,路由中的访问点为 home

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

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

此时的两张路由表将变成这样:

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') # /contactreturn '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。下面的示例将生成URL http://<x.y.z>/contacts :

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

Reference:

作者:chen_h
链接:https://www.jianshu.com/p/cb0f86c7ff48
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

python3 flask 路由相关推荐

  1. Flask路由分发及转换器

    引言 本文重点介绍,Flask路由分发及访问静态资源. 路由分发 app.route 装饰器的作用是将路由映射到视图函数,从浏览器输入对应的 url 地址,Flask程序,就会根据 url 找到对应的 ...

  2. 不花一分钱,搭建一个完全免费的python3+flask+mysql服务器

    不花一分钱,搭建一个完全免费的python3+flask+mysql服务器 转载自:http://www.rendoumi.com/bu-hua-yi-fen-qian-da-jian-yi-ge-w ...

  3. flask -- 路由与视图函数

    原文链接 1. 概述 路由 是MVC架构的Web框架中相当重要的一个概念,也是本节课程的重点.顾名思意,路由就是在迷茫中找出一条路的意思.在Flask框架中,路由 就表示为用户请求的URL找出其对应的 ...

  4. 基于Python3+Flask+SQLite的大学实验室设备管理系统

    资源下载地址:https://download.csdn.net/download/sheziqiong/85709920 资源下载地址:https://download.csdn.net/downl ...

  5. 深入理解Flask路由(2)- werkzeug 路由系统

    本系列共三篇文章: 深入理解Flask路由的实现机制 深入理解Flask路由(2)- werkzeug 路由系统 深入理解Flask路由 (3) - 动态 url 及转换器 上一篇我们说到:Flask ...

  6. flask --- 路由与视图函数

    1.概述 路由是Model View Controller架构的Web框架中的相当重要的一个概念.路由就是在迷茫中找出一条路的意思.在Flack框架中,路由表示为用户请求的URL找出其对应的处理函数的 ...

  7. Flask 路由404 Not Found

    Flask 路由404 Not Found 新的改变 from flask import Flask app = Flask(__name__) @app.route('/') @app.route( ...

  8. Python3 Flask框架

    Flask框架 内容原创,侵权必究.学习分享请注明地址:https://blog.csdn.net/Jackie_ZHF/article/details/82592928 博主有时间会不定期更新大数据 ...

  9. Flask 路由、请求、会话

    准备 每日一问: flask里面加载配置的方法有几种 5种 from_mappig from_object from_json from_envval from_pyfile @app.route() ...

最新文章

  1. 用Gvim建立IDE编程环境 (Windows篇)
  2. LeetCode——15. 3Sum
  3. 数十家公司超10亿数据外泄,2019年数据安全不再“纸上谈兵”
  4. Linux驱动编程 step-by-step (十一)
  5. [Bzoj4196] [NOI2015] 软件包管理器 [树链剖分,线段树]
  6. jenkins的svn路径中文问题
  7. android 速度传感器,Android实战技巧之四十二:加速度传感器
  8. jQuery学习笔记(一) 取值、赋值的基本方法
  9. 浪曦struts2学习笔记1
  10. 基于视觉SLAM的无人机仿真-px4-gazebo
  11. 利用Clonezilla备份还原Linux系统
  12. 区块链报告会心得体会3000_学习区块链的心得体会?
  13. Ubuntu16.04安装搜狗拼音
  14. Python语言程序设计基础 第二版(嵩天著)课后答案第四章
  15. 以CVPR顶会论文为例,探讨AI论文的阅读方法
  16. 表的自然连接(数据结构链表链接)
  17. 2019计算机电源海关征税,回国华人注意!2019中国海关严打:这些东西千万别带了!...
  18. 一篇不错的文章--项目开发经验谈之:设计失败的挫败感
  19. Hash Exercise 21.11.27
  20. 书评:他们思考,我们流汗--《华尔街的肉》

热门文章

  1. dotnet new 命令
  2. 动态磁盘转换基本磁盘
  3. 企业做ISO9001认证需要提供哪些材料
  4. Docker结合.Net Core初步使用
  5. 苹果服务器已删除邮件,在苹果Mac上的“邮件”中如何查看、存储或删除电子邮件附件?...
  6. 58APP引入Kotlin进行Android开发,kotlin高阶函数斐波那契
  7. 国产开源电子表格-Luckysheet
  8. 响应式网格(栅格化)布局总结
  9. 使用Verilog实现FPGA计数器功能
  10. STM32 Cubemax(三)——时序读写完成称重传感器+HX711的使用