本文实例讲述了flask框架url与重定向操作。分享给大家供大家参考,具体如下:
1. url与函数的映射
当我们新建一个flask项目的时候,默认就会有一个hello_world函数,如下面这样
@app.route('/') def hello_world(): return 'hello world'
上面函数中,app.route()的参数就是我们的url,当我们启动项目的时候,我们在浏览器中输入127.0.0.1:5000,就能够访问到我们这个视图了,因为/就是代表"根url",所以我们只需要ip地址和端口就访问到了我们的这个函数视图。
当我们将app.route()的参数改为'/hello/'时,那我们访问这个视图就需要输入网址为127.0.0.1:5000/hello/才能访问到我们的这个视图了,
这就是flask中url与函数的映射。
2. url传入参数
- url中包含参数
当我们访问CSDN,博客园,简书等网站中的文章详情的时候,我们会发现起始每篇文章的详情页面的url前面不封都是一样的,只有后面一部分不一样。那么这个不一样的部分我们就可以当做一个参数传入视图中,然后我们在视图中拿到相应的参数在进行相应的操作,返回相应的数据。那么在flask中怎样实现这个功能呢?
@app.route('/article_detail/<article_id>/') def article_detail(article_id): return "你查看到文章id 为 %s" % article_id
在上面的函数视图中,app.route()
中用<>这个包裹起来的就是我们定义的参数,这里我们就定义了一个article_id这样的参数。当我们在url中定义了一个参数之后,我们必须也在函数中写入这个参数,而且参数名必须和url中的参数名一致。然后我们就可以在视图中拿到article_id这个参数的值了。
然后启动项目,在浏览器中输入127.0.0.1:5000/article_detail/3/等相似 的url,就能够查看到相应的效果了。
上面的例子中虽然我们能够将参数通过url传入函数视图中,但是我们并不能对url做类型限制,比如我们想要的article_id必须是一个int数据,当用户传入的参数不是int型的数据的时候,那么他就访问不到我们这个函数视图.出现404页面.那么flask中怎样实现这样这个需求呢?
在flask中,我们是可以对url指定类型的。
@app.route('/article_detail/<int:article_id>/') def article_detail(article_id): return "你查看到文章id 为 %s" % article_id
这样,我们就对传入的参数做了类型限制。只需要参数前面写上我们的类型就可以了.
在flask中,除了支持int类型外,还支持以下类型:
- string: 默认的数据类型,接受没有任何斜杠/的字符串。
- int: 整形
- float: 浮点型。
- path: 和string类似,但是可以传递斜杠/。
- uuid: uuid类型的字符串。(什么是uuid"htmlcode">
@app.route('/<any(blog,article):url_path>/<int:id>/') def detail(url_path,id): if url_path == 'blog': return 'blog detail is ' + str(id) else: return 'article detail is ' + str(id)
这样,我们在浏览器中输入127.0.0.1:5000/blog/3/或127.0.0.1:5000/article/3/都能够访问到这个视图,那么我们怎么知道当前是以哪个url访问的呢,我们可以通过:后面我们定义的url_path参数来接受这个值,然后我们在视图中也要写入这个参数。然后我们就能拿到这个值了.
- url中以查询字符窜的方式传递参数(get请求)
有些时候,我们并不需要向上面那样传递参数,通过"htmlcode">
from flask import request @app.route('/search/') def search(): name = request.args.get('name') return "查询字符串传入参数 %s" % name
比如在上面的视图函数中,我想传入name=xxx,以查询字符窜的方式(get请求),那么我们直接在浏览器中输入127.0.0.1:5000/search/"htmlcode">
from flask import url_for @app.route('/url_for/') def url_for_demo(): return 'url_for_demo' @app.route('/index/') def index(): # 函数的名字 return url_for('url_for_demo')
url_for中参数为函数的名字,如果传入的函数不存在就会报错。让我们在浏览器中输入127.0.0.1:5000/index/的时候,我们就能够看到url_for_demo这个函数对应的url了。没有参数的url学会了,那么如果url中携带参数怎么办?
在url_for这个函数中,我们也是可以传入关键字参数的,只需要和url中的参数对应上就好了。
@app.route('/article/<int:article_id>/') def article_detail(article_id): return "article id is " + str(article_id) @app.route('/index/') def index(): # 注意 这里的关键字参数的key不是随便取的,必须的和该函数对应的url中参数名一样 url = url_for('article_detail',article_id=2) return url
这样,我们也能在url_for中传入url的参数了
那么如果我们在url_for中传入url中不存在的关键字参数,会怎么样呢?
@app.route('/article/<int:article_id>/') def article_detail(article_id): return "article id is " + str(article_id) @app.route('/index/') def index(): # 注意 这里的关键字参数的key不是随便取的,必须的和该函数对应的url中参数名一样 url = url_for('article_detail',article_id=2,name='xxx') return url
当我们访问这个url的时候,就会返回这样的一个url:/article/2/"htmlcode">
from flask import redirect,url_for @app.route('/login/') def login(): return 'login' @app.route('/profile/') def profile(): name = request.args.get('name') if name: return 'profile 页面' else: return redirect( url_for('login') )
上面的代码就实现了我们的需求。
这个时候可能有人会问,在redirect函数中,我们也可以不使用url_for,直接构造手动构造url啊,也不是特别麻烦的,例如这样。
return redirect('login')
,这样,我也能直接跳转至login页面啊。这里就大概说一下使用url_for的好处吧:
- 当我们的项目特别大的时候,如果某一天老板需要我们修改一下url,例如将/index/修改为/xxx/index/,那么我们在app.route中修改了之后,如果我们的项目中大量的使用的redirect重定向到我们的这个函数视图中,那么我们就必须的去代码中一个一个的找出来,然后去修改代码,而如果我们使用了url_for,那就不会出现这样的问题了,直接修改@app.route就行了,而其他地方因为我们使用的是url_for生成的,所以完全不需要我们去修改。
- 当我们的url中拥有特殊字符的时候,如'/',如果我们直接手动构造这个参数的话,那么就可能会出现歧义了,这个'/‘是当做url中的'/‘来识别呢还是当做一个普通的字符'/‘来识别呢,所以可能就会出现页面找不到的情况,而使用url_for的话,url_for就会将'/'编码,然后我们使用的时候优惠解码回来,所以就不会出翔上面那种状况。
5. 指定HTTP请求方法
有些时候,我们的一个视图只允许POST方法访问,而
@app.route()
默认只允许GET方法,那么我们如何指定允许请求的方法呢?在
@app.route()
中可以传入一个关键字参数methods来指定本方法支持的HTTP方法# 只允许POST方法 @app.route('/post_demo/',methods=['POST']) def post_demo(): return 'post' # 默认的就是这种情况,所以当方法为get请求是,我们一般都省略不写 @app.route('/get_demo/',methods=['GET']) def get_demo(): return 'get' # GET,POST方法都允许 @app.route('/all_demo/',methods=['POST','GET']) def all_demo(): return 'all'
注意:
@app.route('/index')
与@app.route('/index/')
起始是对应的两个url,一般我们在项目中,都是使用后面一种,因为在有些浏览器中,当我们最后面没有加'/'时,浏览器会自动给我们添加上去,而我们有没有这样的一个url,所以就有可能会造成页面找不到的情况。所以在项目中,我们一般都会写成后面那种形式。希望本文所述对大家基于flask框架的Python程序设计有所帮助。
flask,url,重定向
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 明达年度发烧碟MasterSuperiorAudiophile2021[DSF]
- 英文DJ 《致命的温柔》24K德国HD金碟DTS 2CD[WAV+分轨][1.7G]
- 张学友1997《不老的传说》宝丽金首版 [WAV+CUE][971M]
- 张韶涵2024 《不负韶华》开盘母带[低速原抓WAV+CUE][1.1G]
- lol全球总决赛lcs三号种子是谁 S14全球总决赛lcs三号种子队伍介绍
- lol全球总决赛lck三号种子是谁 S14全球总决赛lck三号种子队伍
- 群星.2005-三里屯音乐之男孩女孩的情人节【太合麦田】【WAV+CUE】
- 崔健.2005-给你一点颜色【东西音乐】【WAV+CUE】
- 南台湾小姑娘.1998-心爱,等一下【大旗】【WAV+CUE】
- 【新世纪】群星-美丽人生(CestLaVie)(6CD)[WAV+CUE]
- ProteanQuartet-Tempusomniavincit(2024)[24-WAV]
- SirEdwardElgarconductsElgar[FLAC+CUE]
- 田震《20世纪中华歌坛名人百集珍藏版》[WAV+CUE][1G]
- BEYOND《大地》24K金蝶限量编号[低速原抓WAV+CUE][986M]
- 陈奕迅《准备中 SACD》[日本限量版] [WAV+CUE][1.2G]