flask第七篇——URL与视图函数的映射
有兴趣的朋友可以添加微信公众号:自动化测试实战
今天开始就要进入正题了。大家都准备好了吧~
代码提示
先和大家说个小知识点:有同学后台说输入flask代码pycharm不提示,现在告诉你一个解决方法:app = Flask(__name__) # type: Flask
在上面代码后面加上# type: Flask
就会提示啦。
URL与视图函数的映射
url与视图函数的映射是通过@app.route()
装饰器实现的。
1、只有一个斜杠代表的是根目录——首页。
# coding: utf-8
from flask import Flask
# __name__是用来确定flask运行的主文件
app = Flask(__name__) # type: Flask
app.debug = True
# app.config.from_object('configs')
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
上面代码`@app.route('/')`装饰器传参只有一个斜杠/,这时候运行代码就会跳转到根目录——首页。如图:
2、传参
URL传参是通过`<参数名称>`的形式进行传递。另外,URL中有几个参数,在视图函数中也要指定几个参数。参数名称可以自己定义,代码如下:
# coding: utf-8
from flask import Flask
# __name__是用来确定flask运行的主文件
app = Flask(__name__) # type: Flask
app.debug = True
# app.config.from_object('configs')
# 根目录
@app.route('/')
def hello_world():
return 'Hello World!'
# 传参
@app.route('/content/<username>/<password>/')
def login(username, password):
return u'我的用户名是:%s,密码是:%s' % (username, password)
if __name__ == '__main__':
app.run()
执行代码后,在浏览器输入你设置的地址可以看到:
需要注意的是,上面<>里面写的参数名称必须和你def函数里传参名称相同,比如我写的参数名叫username,那么我代码里login后面的形参名称必须叫username,上面代码我传了两个参数,地址写的时候分别传了warrior和123。
3、URL的数据类型
1)如果没有指定,默认是
string
类型
2)string:字符串,接收任何没有斜杠/的字符。
3)int:整型
4)float:浮点类型
5)path:和string类似,但是可以接收斜杠/
6)uuid:只接收uuid字符串
7)any:可以指定多个路径
例如,现在我们指定一个参数为int类型:
# coding: utf-8
from flask import Flask
# __name__是用来确定flask运行的主文件
app = Flask(__name__) # type: Flask
app.debug = True
# 根目录
@app.route('/')
def hello_world():
return 'Hello World!'
# @app.route('/content/<username>/<password>/')
# def login(username, password):
# return u'我的用户名是:%s,密码是:%s' % (username, password)
@app.route('/content/<int:username>/<int:password>/')
def login(username, password):
return u'我的用户名是:%s,密码是:%s' % (username, password)
if __name__ == '__main__':
app.run()
在页面中我传入两个1,可以看到:
但是当我传入warrior和1以后就找不到页面了,因为warrior不是int类型:
uuid
接下来简单说一下uuid,因为uuid在传参的时候更长用,uuid就是唯一的一串字符,永远不会出现重复,比如:
# coding: utf-8
from flask import Flask
import uuid
app = Flask(__name__) # type: Flask
app.debug = True
# 根目录
@app.route('/')
def hello_world():
return 'Hello World!'
# @app.route('/content/<username>/<password>/')
# def login(username, password):
# return u'我的用户名是:%s,密码是:%s' % (username, password)
@app.route('/content/<uuid:username>/')
def login(username):
return u'我的用户名是:%s' % (username)
print uuid.uuid4()
if __name__ == '__main__':
app.run()
上面代码中我们先导入了import uuid
模块,然后通过print uuid.uuid4()
打印出了一串uuid:
这时候因为我们指定了username是uuid类型的,所以当我们进入http://127.0.0.1:5000/content/1/
的时候就会找不到地址,我们将控制台打印的uuid替换1:http://127.0.0.1:5000/content/7bdcd04c-62fd-48e8-b12b-bbd636cd0315/
就可以看到:
any
any就是指定传递的任意参数,比如下面代码我们指定传参为username或者blog,那么我们在URL中输入username或者blog都会链接到指定页面,输入any指定参数以外的内容页面则会报错:
# coding: utf-8
from flask import Flask
import flask
import uuid
app = Flask(__name__) # type: Flask
app.debug = True
# 根目录
@app.route('/')
def hello_world():
return 'Hello World!'
# @app.route('/content/<username>/<password>/')
# def login(username, password):
# return u'我的用户名是:%s,密码是:%s' % (username, password)
@app.route('/content/<uuid:username>/')
def login(username):
return u'我的用户名是:%s' % (username)
@app.route('/post/<any(username,blog):name>/')
def post_info(name):
return u'id是:%s' % name
print uuid.uuid4()
if __name__ == '__main__':
app.run()
参数传递
最后我们来说一下参数传递。理论上推荐path——接收带斜杠的字符串形式传递参数,因为这样有利于网站的SEO即网站在搜索引擎结果的排名:
@app.route('/post/<path:username>/')
def user(username):
return u'用户名字是:%s' % username
另一种传参方式就是大部分网站在用的?path=1&username=warrior
这种查询字符串的方式:
@app.route('/post/')
def question():
post_id = flask.request.args.get('post_id')
return u'post_id是:%s' % post_id
上面flask.request.args.get('post_id')
就是获取地址里的传参:
至于想用哪种方式,就看你是不是在乎自己网站在搜索引擎中的排名啦~
这一节内容稍微有点多,大家慢慢消化,最后把代码贴给大家,供大家参考:
# coding: utf-8
from flask import Flask
import flask
import uuid
# __name__是用来确定flask运行的主文件
app = Flask(__name__) # type: Flask
app.debug = True
# 根目录
@app.route('/')
def hello_world():
return 'Hello World!'
# @app.route('/content/<username>/<password>/')
# def login(username, password):
# return u'我的用户名是:%s,密码是:%s' % (username, password)
# uuid
@app.route('/content/<uuid:username>/')
def login(username):
return u'我的用户名是:%s' % (username)
# any
@app.route('/post/<any(username,blog):name>/')
def post_info(name):
return u'id是:%s' % name
# path
@app.route('/post/<path:username>/')
def user(username):
return u'用户名字是:%s' % username
# ?id=1&user=warrior形式传递参数
@app.route('/post/')
def question():
post_id = flask.request.args.get('post_id')
return u'post_id是:%s' % post_id
print uuid.uuid4()
if __name__ == '__main__':
app.run()
flask第七篇——URL与视图函数的映射的更多相关文章
- URL与视图函数的映射
今天跟大家讲的是URL与视图函数的映射 URL与视图函数的映射 url与视图函数的映射是通过@app.route()装饰器实现的. 1.只有一个斜杠代表的是根目录——首页. # coding: utf ...
- Python学习笔记整理总结【Django】【MVC/MTV/路由分配系统(URL)/视图函数 (views)/表单交互】
一.Web框架概述 Web框架本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python # -*- coding:utf-8 ...
- django重点url,视图函数,模板语言
django重点url,视图函数,模板语言url 1.django重点url无命名分组:re_path() 2.url第一个参:url未命别名分组就不需要views中参数一定,若命别名(?P<y ...
- 01_Django-介绍-项目结构-URL和视图函数
01_Django-介绍-项目结构-URL和视图函数 视频:https://www.bilibili.com/video/BV1vK4y1o7jH 博客:https://blog.csdn.net/c ...
- Flask实战第6天:视图函数Response返回值
视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...
- Flask最强攻略 - 跟DragonFire学Flask - 第七篇 Flask 中路由系统
Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...
- Flask从入门到精通之在视图函数中处理表单
在新版hello.py 中,视图函数index() 不仅要渲染表单,还要接收表单中的数据.更新后的index() 视图函数如下: @app.route('/') def index(): name = ...
- 6、Flask实战第6天:视图函数Response返回值
视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...
- flask 第七篇 路由系统
Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...
随机推荐
- 关于IIS权限问题(Selenium WebDriver调用出错记录)
本地VS调试过程中用Selenium WebDriver打开FF浏览器可以正常工作,项目部署至IIS后请求调用浏览器一直提示超时,异常如下: 因为本地调试可以成功,首先排除组件版本问题和浏览器兼容问题 ...
- [spring]Bean注入——使用注解代替xml配置
使用注解编程,主要是为了替代xml文件,使开发更加快速. 一.使用注解前提: <?xml version="1.0" encoding="UTF-8"?& ...
- Oracle like '%...%' 优化
Oracle like '%...%' 优化 1.尽量不要使用 like '%%' 2.对于 like '%' (不以 % 开头),Oracle可以应用 colunm上的index 3.对于 like ...
- p-value值的认识
待续:https://www.zhihu.com/question/21429785/answer/147047565
- HDU-4123-树形dp+rmq+尺取
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Ansible 小手册系列 十二(Facts)
Facts 是用来采集目标系统信息的,具体是用setup模块来采集得. 使用setup模块来获取目标系统信息 ansible hostname -m setup 仅显示与ansible相关的内存信息 ...
- iptables详解(12):iptables动作总结之一
前文一直在介绍iptables的匹配条件,并没有对动作进行过总结,那么此处,我们就来总结一下iptables中的动作. 之前的举例中已经用到了一些常用动作,比如ACCEPT.DROP.REJECT等. ...
- bzoj2241
题解: 暴力枚举锤子大小 然后前缀和判断是否可行 代码: #include<bits/stdc++.h> #define N 105 using namespace std; int m, ...
- vue的v-model绑定数据问题
在我的项目中有一个这样的功能模块: 我们修改数据全是在前台的table中修改,然后把这个table的值带到后台.(理想:修改值后,点击确认值改变,点击取消值恢复原来的值)那么问题就来了: a)你修改值 ...
- JS中apply与call的用法
JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 先来看看JS手册中对call的解释: call 方法调用一个对象的一个方法,以另一个对象替换当前对象. cal ...