今天开始就要进入正题了。大家都准备好了吧~ 代码提示 先和大家说个小知识点:有同学后台说输入flask代码pycharm不提示,现在告诉你一个解决方法:app = Flask(__name__) # type: Flask 在上面代码后面加上# type: Flask 就会提示啦。 URL与视图函数的映射url与视图函数的映射是通过@app.route() 装饰器实现的。 # 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('/')`装饰器传参只有一个斜杠/,这时候运行代码就会跳转到根目录——首页。如图:
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。 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的赞赏和提的建议~~
|