面试题答案
一键面试定义带参数路由的语法
在Flask中,定义带参数路由使用尖括号 <>
来捕获参数。例如:
from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>')
def show_user_profile(username):
return f'User {username}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post {post_id}'
这里,/<username>
和 /<int:post_id>
分别定义了捕获字符串类型的 username
参数和整数类型的 post_id
参数的路由。类型限定词(如 int
)是可选的,如果不指定,参数默认是字符串类型。
在视图函数中获取并处理参数
- 对于上述路由定义的参数:
在视图函数的参数列表中直接声明与路由中捕获参数同名的参数,即可获取该参数值。如上面例子中,
show_user_profile
函数的username
参数和show_post
函数的post_id
参数。然后可以根据业务需求进行处理,如查询数据库、返回特定响应等。 - 对于查询字符串参数(常见于GET请求):
在视图函数中可以通过
request.args
获取,request
是Flask提供的请求上下文对象。例如:
from flask import Flask, request
app = Flask(__name__)
@app.route('/search')
def search():
keyword = request.args.get('keyword', '')
return f'Searching for {keyword}'
这里使用 request.args.get
方法获取名为 keyword
的查询字符串参数,如果参数不存在则返回空字符串。
3. 对于表单数据参数(常见于POST请求):
在视图函数中可以通过 request.form
获取。例如:
from flask import Flask, request
app = Flask(__name__)
@app.route('/submit', methods=['POST'])
def submit():
username = request.form.get('username')
password = request.form.get('password')
return f'Username: {username}, Password: {password}'
这里使用 request.form.get
方法获取表单中名为 username
和 password
的参数值。
GET和POST请求下处理参数方式的异同
- 相同点:
- 都可以通过
request
对象来获取参数。无论是GET还是POST请求,Flask都使用相同的request
上下文对象来处理请求相关信息。 - 对于在路由中定义的参数(如
/user/<username>
中的username
),获取和处理方式不受请求方法影响,都是在视图函数参数列表中声明同名参数来获取。
- 都可以通过
- 不同点:
- 参数位置:
- GET请求:参数通常以查询字符串的形式附加在URL后面,例如
http://example.com/search?keyword=python
。通过request.args
获取。 - POST请求:参数通常放在请求体中,例如在HTML表单提交时,数据会以表单格式放在请求体。通过
request.form
获取。
- GET请求:参数通常以查询字符串的形式附加在URL后面,例如
- 安全性:
- GET请求:参数暴露在URL中,不太适合传递敏感信息,如密码等。因为URL可能会被记录在日志、浏览器历史等地方。
- POST请求:参数在请求体中,相对更安全,适合传递敏感数据。
- 数据长度限制:
- GET请求:由于URL长度限制(不同浏览器和服务器有不同限制,一般较短),所以能传递的数据量有限。
- POST请求:理论上对请求体大小没有限制(实际受服务器配置限制),可以传递大量数据。
- 参数位置: