专栏首页自动化测试实战flask第七篇——URL与视图函数的映射

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

感谢@zuz5的赞赏和提的建议~~

本文分享自微信公众号 - 自动化测试实战(gh_839e78b6ba28),作者:孟船长

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-05

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • flask第十六篇——Response【2】

    用户2149234
  • Flask第四篇——第一个程序

    用户2149234
  • flask第二十五篇——控制语句

    用户2149234
  • flask helloworld (flask 1)

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

    用户5760343
  • 数组对象转为Map

    数据类型的转换在业务代码中肯定很常见,因为不同的数据结构使用不同的情况。比如数组适合下标快速检索,对象适合根据键快速检索。

    前端黑板报
  • Scala面向对象编程之类和对象

    调用方法也可以不加括号,如果定义方法时不带括号,则调用方法时也不能带括号 (2)getter与setter 定义不带private的var field,此时...

    魏晓蕾
  • 事物隔离级别

    @Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不...

    动力节点Java学院
  • Vuex从入门到精通(一)

    状态管理 状态的初始化 状态管理,我们应该并不陌生。 举个例子,超市里新进了一批商品,管理员给这些商品分类,建立索引,然后按照顺序放入货架的过程就是最简单的状态...

    lonelydawn
  • CRM和C4C product category hierarchy的可编辑性控制逻辑

    从ERP导入到CRM系统的Product Hierarchy,在CRM系统切换成编辑模式时,会收到一条提示信息:

    Jerry Wang
  • vue之vuex2.0使用详解

    Vuex 的核心是 store, 它是一个通过 Vuex.Store 构造函数生成的对象。为什么它会是核心呢?因为我们调用这个构造函数创建store 对象的时候...

    开发架构二三事

扫码关注云+社区

领取腾讯云代金券