0
点赞
收藏
分享

微信扫一扫

windows python web route路由详解

1. 路由介绍

路由是指用户请求的URL与视图函数之间的映射。Flask框架 根据HTTP请求的URL在路由表中匹配预定义的URL规则,找到对应的视图函数, 并将视图函数的执行结果返回WSGI服务器。
可见路由表在Flask应用中处于相当核心的位置。路由表的内容是由应用开发者填充。

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

2. 路由类型

2.1 一般路由url

第一种:没有名字的路由

@app.route('/')
def hello_world():
return 'Welcome to Hello World !'

访问:http://127.0.0.1:5000/
第二种,定义一个名字

@app.route('/hello')
def hello_world():
return 'Welcome to Hello World !'

访问:http://127.0.0.1:5000/hello

第三种:一个函数多个url路由规则

@app.route('/')
@app.route('/hello')
@app.route('/hello/')

def hello(name=None):
if name is None:
name = 'World'
return 'Hello %s' % name

访问:http://127.0.0.1:5000/
访问:http://127.0.0.1:5000/hello
访问:http://127.0.0.1:5000/hello/xiaoaming
访问:http://127.0.0.1:5000/ligang

第四种:​​add_url_rule()​​​定义一个路由url
route装饰器内部也是通过调用add_url_rule()方法实现的路由注册

def hello():
return 'Welcome to Hello World !'
app.add_url_rule('/hello',view_func=hello)

访问:http://127.0.0.1:5000/hello

2.2 带参数的路由url

@app.route('/hello/')
def hello(name):
return 'Hello %s' % name

name为随意字符串,结果输出:
windows python web route路由详解_字符串
除了界面验证,我们也可以用命令行工具​​​ipython​​测试:

pip install ipython  #安装
ipython #进入ipython

In [1]: import requests

In [2]: r = requests.get("http://192.168.1.4:5000/hello/zong")

In [3]: r.text
Out[3]: u'Hello zong'

参数是有类型的。默认是string
传递参数的语法是​​​/<参数类型:参数名称>/​​​,然后在视图函数中也要定义同名的参数

  • string:只接受字符串,没有任何“/或者”的文本
  • int:只接受整数
  • float:只接受浮点数,整数都不行哈
  • path:和string类似,但是接受斜杠
  • uuid:只有接受符合uuid的字符赤岸,一般用作表的主键
  • any:可以指定多种路径

示例:

rom flask import Flask,request
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/list/')
def article_list():
return 'article list!'
@app.route('/p1/')
def article_detail(article_id1):
return "请求的文章是:%s" %article_id1
@app.route('/p2/')
def article_detail2(article_id2):
return "请求的文章是:%s" %article_id2
@app.route('/p3/')
def article_detail3(article_id3):
return "请求的文章是:%s" %article_id3
@app.route('/p4/')
def article_detail4(article_id4):
return "请求的文章是:%s" %article_id4
# import uuid
# print(uuid.uuid4())
@app.route('/p5/') #数据的唯一性,长度较长,有损效率(一般在用户表中使用)6a9221f6-afea-424a-a324-8ceaa5bdfc98
def article_detail5(article_id5):
return "请求的文章是:%s" %article_id5
@app.route('/p6///')
def detail(url_path,id):
if url_path == "blog":
return "博客详情 %s" %id
else:
return "用户详情 %s" %id
#通过问号形式传递参数
@app.route('/d/')
def d():
wd = request.args.get('wd') #获取浏览器传递参数
return '通过查询字符串的方式传递的参数是,%s'%wd #请求http://127.0.0.1:8080/d/?wd=php
if __name__ == '__main__':
app.run()

2.3 带url_for传参的路由url

对url再次包装处理。

url_for的第一个参数是视图函数的函数名对应的字符串(endpoint),后面的参数就是你传递给url;如果传递的参数在url中已经定义了,那么这个参数就会被当成path的值传递给url;如果这个参数没有在url中定义,那么将变成查询字符串的形式。
语法格式:

url_for('login')    # 返回/login
url_for('login', id='1') # 将id作为URL参数,返回/login?id=1
url_for('hello', name='man') # 适配hello函数的name参数,返回/hello/man
url_for('static', filename='style.css') # 静态文件地址,返回/static/style.css

示例1

from flask import Flask,url_for,request
@app.route('/')
return url_for('my_list',page=1,count=2) #这样的话就会在页面上构建出/post/list/1/?count=2的信息
@app.route('/post/list//')
def my_list():
return 'my list'

示例2:

from flask import Flask,url_for,request
@app.route('/')
def hello_world():
return url_for('login',next='/current') #页面返回/login/?next=%2Fcurrent登录前的信息
# print(url_for('my_list',page=1,count=200))
# return 'hello world'
@app.route('/login/')
def login():
# next = request.args.get('next') #登录前的信息,在登陆之后仍旧保持
return 'login'
@app.route('/list/')
def my_list():
return 'my list'
@app.route('/detail//')
def detail():
return 'detail'
if __name__ == '__main__':
app.run(debug=True)

2.4 不同http方法的路由url

当设置请求方式只能是​​POST​​​时,​​GET​​就会报错。

@app.route('/hello/',methods=["POST"])
def hello(name):
return 'Hello %s' % name

测试:

In [1]: import requests

In [2]: r = requests.get("http://192.168.1.4:5000/hello/zong")

In [3]: r.text
Out[6]: u'\n405 Method Not Allowed\nMethod Not Allowed\n

The method is not allowed for the requested URL.

\n'


In [7]: r.status_code
Out[7]: 405

In [8]: r = requests.post("http://192.168.1.4:5000/hello/zong")

In [9]: r.text
Out[9]: u'Hello zong'

In [10]: r.status_code
Out[10]: 200

如何想两种http方法都支持。

from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return 'This is a POST request'
else:
return 'This is a GET request'

举报

相关推荐

0 条评论