第2章 路由

学习目标

  • 掌握注册路由的方式,能够独立完成路由的注册

  • 掌握URL传递参数的方式,能够通过URL规则向视图函数传递参数

  • 掌握转换器用法,能够根据业务需求灵活应用内置转换器或自定义转换器

  • 掌握指定请求方式,能够在注册路由时指定请求方式

  • 掌握请求钩子,能够在程序中灵活运用请求钩子

  • 掌握上下文,能够通过上下文处理程序中的请求

  • 了解响应报文,能够说出响应报文的组成部分及其作用

  • 掌握响应的创建方式,能够灵活通过make_response()函数生成响应

  • 掌握URL反向解析,能够通过url_for()获取反向解析的URL

  • 掌握页面重定向,能够通过redirect()对页面进行重定向

通过第1章的学习,我们已经对Flask框架有了初步的认识,但是这对使用Flask框架进行项目开发来说还远远不够,因此需要进一步学习Flask框架的知识。本章将针对注册路由、URL传递参数、处理请求等相关内容进行介绍。

2.1 注册路由

在Flask程序中,浏览器通过URL发送HTTP请求给Web服务器,Web服务器再将HTTP请求转发给Flask程序。Flask程序接收到HTTP请求后,需要知道Flask程序中哪部分代码对这个请求进行处理。为此,Flask程序保存了一个URL与视图函数或类的映射关系,建立映射关系的过程称为注册路由。

路由注册完成后,当浏览器根据URL访问网站时会执行Flask程序中与该URL关联的视图函数或类。在Flask中,注册路由一般分为两种方式,一种方式是通过route()方法进行注册,另一种方式是通过add_url_rule()方法进行注册。

1.通过route()方法注册路由

route()是Flask类提供的方法,该方法用于将视图函数与特定的URL建立关联,当通过浏览器访问URL时程序内部自动调用与之关联的视图函数。

route(rule, methods, **options)

rule:必选参数,表示URL规则字符串,该字符串必须以“/”开始。 methods:可选参数,表示HTTP请求方法。 **options:可选参数,表示传递给底层werkzeug.routing.Rule对象的额外选项。

若URL规则字符串以“/”结尾,但用户访问URL时并没有在URL末尾附加“/”,则会自动重定向到附加了“/”的页面;若URL规则字符串的末尾没有附加“/”,但用户通过URL访问页面时在URL末尾附加了“/”,则会出现404页面。

route()方法的用法比较特殊,需要以装饰器的形式写在视图函数的上方。 下面通过一个示例演示如何通过route()方法注册路由,使视图函数与URL建立关联。

from flask import Flask
app = Flask(__name__)
@app.route('/index')    # 通过route()方法注册路由,URL规则为/index
def index():return f'<h1>这是首页!</h1>'
if __name__ == '__main__':app.run()

2.通过add_url_rule ()方法注册路由

add_url_rule()也是Flask类提供的方法,该方法一般需要传递URL和URL关联的函数名。

add_url_rule(rule, endpoint=None, view_func=None,provide_automatic_options=None, **options)

rule:必选参数,表示URL规则字符串。 endpoint:可选参数,表示端点名称。 view_func:可选参数,表示与端点关联的视图函数名。 methods:可选参数,表示定义的HTTP请求方法。 **options:可选参数,表示传递给底层werkzeug.routing.Rule对象的额外选项。

下面通过示例代码,演示add_url_rule()方法注册路由,使视图函数与URL建立关联。

from flask import Flask
app = Flask(__name__)
def index_new():return f'<h1>这是首页!</h1>'
# 通过add_url_rule()方法注册路由
app.add_url_rule(rule='/index', view_func=index_new)
if __name__ == '__main__':app.run()

分析route()方法的源码可知,route()方法内部其实调用了add_url_rule()方法,我们可以把route()当作add_url_rule()方法的快捷方法,route()方法的用法更简洁,无需传入与URL规则关联的视图函数名。

在Flask程序中,一个视图函数也可以绑定多个URL,当浏览器访问这些URL时会触发Flask程序中的同一个视图函数,也就是说在浏览器中展示的效果相同。

@app.route('/homepage')
@app.route('/index')
def index():return f'<h1>这是首页!</h1>'

2.2 URL传递参数

2.2.1 URL传递参数的方式

当调用route()或add_url_rule()方法注册路由时,可以在URL规则字符串中加入尖括号包裹的变量,用于标记URL中动态变化部分的内容,之后将该变量作为参数传递给视图函数。

<variable_name>

variable_name表示变量名。

通过一个示例演示如何通过URL传递参数,以及在视图函数中如何使用传递的参数。

from flask import Flask
app = Flask(__name__)
@app.route('/<page>')      # URL规则字符串中加入变量page
def page_num(page):        # 将page参数传递给视图函数return f'当前为第{page}页'
if __name__ == '__main__':app.run()

2.2.2 为参数指定转换器

当URL向视图函数传递参数时,如果需要限定参数的类型,那么可以通过转换器指定参数的类型。

<converter:variable_name>

converter表示转换器,它支持两种类型的转换器,分别是内置转换器和自定义转换器。

1.内置转换器

Flask框架中提供了6种内置转换器。

转换器说明
string默认值,匹配非空字符串,但不包含“/”
any匹配给定的一系列值中的某一个元素
int匹配整型
float匹配浮点型
path与string类似,匹配非空字符串,但允许字符串中包含“/”
uuid匹配UUID字符串

如果为参数明确指定了转换器,那么URL中传递的参数必须符合转换器要求的数据类型。

为URL中传递的参数page显式指定转换器为int。

from flask import Flask
app = Flask(__name__)
@app.route('/<int:page>')
def page_num(page):return f'当前为第{page}页'
if __name__ == '__main__':app.run()

2.自定义转换器

自定义转换器本质上是一个类,该类需要继承werkzeug.routing模块中的BaseConverter类。BaseConverter类中包含以下一些属性和方法。

regex属性:用于设置正则匹配规则。 to_python()方法:用于将URL中的参数转换为需要传递到视图函数中的类型。 to_url()方法:用于将Python数据类型转换为URL中使用的字符串。

自定义转换器定义完成之后,需要通过url_map.converters添加到转换器字典中。添加自定义转换器的格式如下所示。

程序实例.url_map.converters["自定义转换器名称"]=自定义转换器的类名 

以匹配手机号码的转换器为例演示如何定义和使用自定义转换器。

from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
class MobileConverter(BaseConverter):  # 自定义转换器regex = "1[3-9]\d{9}$"  # 定义匹配手机号码的规则
app.url_map.converters["mobile"] = MobileConverter # 添加到转换器字典
@app.route("/user/<mobile:mobile>")
def index(mobile):return f'手机号为:{mobile}'
if __name__ == '__main__':app.run()

多学一招:UUID

UUID是通用唯一识别码(Universally Unique Identifier)的缩写,它是一种软件建构的标准,用于让分布式系统中的所有元素都能有唯一的辨识信息。如此一来,每个人都可以创建不与其他人冲突的UUID。 UUID由32位数的16进制数字所构成,以连字符“-”分隔成五组来显示,形式为 8-4-4-4-12例如,223e1234-a99b-12d3-a426-5266cd448472。

2.3 处理请求

2.3.1 指定请求方式

当我们在浏览器的地址栏中输入URL地址后,可以访问网站页面、向网站提交数据、下载网站中的资源,那么网站服务器如何判断要执行哪种操作呢?其实网站服务器会根据HTTP请求方法来处理不同的需求。 在HTTP规范中定义了一组常用的请求方法,例如,GET方法负责从服务器请求某些资源,POST方法会向服务器发送处理的数据等。

HTTP规范中定义的请求方法。

请求方法说明
GET用于请求服务器索要某个资源
POST用于向服务器提交表单或上传文件,表单数据或文件的数据会包含在请求体中
HEAD类似GET方法,但服务器返回的响应中没有具体内容,只有响应头部
PUT从客户端向服务器传送的数据取代指定的文档的内容
DELETE用于请求服务器删除指定的资源
OPTIONS允许客户端查看服务器支持的各项功能
PATCHPUT方法的补充,用于对已知资源进行局部更新

Flask程序中同样支持发送HTTP规范中的请求方法,我们可以在使用装饰器route()或add_url_rule()方法注册路由时传入参数methods来指定使用的请求方法,该参数会以列表形式接收一种或多种请求方法。

在Flask程序的视图函数中,默认的请求方式为GET,而HEAD和OPTIONS这两个请求方法由Flask自动处理。

在Flask2.0及其之后的版本提供了指定部分请求方式的便捷函数,这些函数与请求方法的名称相同,且都是小写形式的。

get():route()传递methods=["GET"]的快捷函数。 post():route()传递methods=["POST"]的快捷函数。 put():route()传递methods=["PUT"]的快捷函数。 delete():route()传递methods=["DELETE"]的快捷函数。 patch():route()传递methods=["PATCH"]的快捷函数。

在Flask程序中使用上述快捷函数,只需要通过装饰器的形式添加到在视图函数上方即可。

@app.post('/login')
def login():pass

2.3.2 请求钩子

在开发Flask程序时,一个网站中可能有多个功能需要判断用户的身份,为了避免让每个视图函数编写判断用户身份的功能代码,Flask提供了注册通用函数的功能,即请求钩子。

Flask提供的请求钩子及其说明。

请求钩子说明
before_first_request注册一个函数,用于在处理第一个请求之前执行,后续请求将不再执行
before_request注册一个函数,用于在每一次请求之前执行
after_request注册一个函数,该函数需要接收响应对象作为参数。若程序没有抛出异常,则会在每次请求后执行该函数
teardown_request注册一个函数,即使程序有未处理的异常,也在每次请求之后执行该函数。如果程序发生异常,需要将该异常信息作为参数传入注册的函数中
after_this_request在视图函数内注册一个函数,用于在这个请求后执行,该函数需要接收响应对象作为参数

请求钩子注册的函数名称是开发者自定义的,无需与请求钩子名称相同。请求钩子都会在请求处理的不同阶段执行,请求钩子的调用流程。

from flask import Flask, after_this_requestapp = Flask(__name__)
@app.before_first_request
def before_first_request():print('这是请求钩子before_first_request注册的函数')
@app.before_request
def before_request():print('这是请求钩子before_request注册的函数')
@app.route('/index')
def index():print('hello flask')@after_this_requestdef after_this_request_func(response):print('这是请求钩子after_this_request注册的函数')return responsereturn 'hello flask'
@app.after_request
def after_request(response):print('这是请求钩子after_request注册的函数')return response
@app.teardown_request
def teardown_request(error):print('这是请求钩子teardown_request注册的函数')if __name__ == '__main__':app.run()

2.3.3 上下文

Flask使用上下文临时保存了程序运行过程中的一些信息。Flask中有两种上下文,分别是请求上下文和应用上下文,其中应用上下文是随着请求上下文产生而产生,随着请求上下文销毁而销毁。

1.请求上下文

Flask的请求上下文包括request对象和session对象,其中request对象封装了请求信息;session对象用于记录请求会话中的用户信息。 request对象中提供了用于处理请求信息的常用属性。

request对象中提供了用于处理请求信息的常用属性。

属性说明
args获取URL中的请求参数
methods获取请求的HTTP方法
cookies获取包含Cookie名称和值的字典对象
data获取包含字符串形式的请求数据
form获取解析后的表单数据
values一个包含form和args全部内容的CombineMultiDict
headers获取首部字段
user_agent获取浏览器标识信息

request对象中提供了用于处理请求信息的常用方法。

方法说明
close()关闭当前请求
get_data()获取请求中的数据
get_json()作为JSON解析并返回数据
make_form_data_parse()创建表单数据解析器
from flask import Flask, requestapp = Flask(__name__)
@app.route('/index')
def index():user_agent = request.user_agent  # 获取浏览器标识信息return f'{user_agent}'
if __name__ == '__main__':app.run()

因为HTTP是无状态的协议,也就是说浏览器发起的每个HTTP请求,对于服务器而言都是彼此独立的,所以服务器无法判断请求是否由同一个浏览器发送。为了能够判断接收的请求是否由同一浏览器发送的,服务器通常会通过会话跟踪技术实现状态保持,常用的会话跟踪技术有Cookie和Session,其中Cookie通过在浏览器记录信息确定用户身份;Session通过在服务端记录信息确定用户身份,它通常依赖于Cookie。

在Flask的请求上下文中,session对象用于管理Session,以实现状态保持。session对象实现状态保持的原理如下。

当服务器收到浏览器发送的请求时,会检查浏览器中是否包含名称为session的Cookie信息,如果不存在,那么浏览器会认为当前请求是一个新会话,并生成一个名称为session的信息存储到浏览器的Cookie中。 浏览器在下一次请求服务器时,将携带Cookie中存储的session信息,此时服务器通过浏览器提交的session信息便可以辨别出当前请求属于哪个浏览器。

在Flask中,session对象提供了很多获取Cookie信息的方法。

方法说明
get(key)通过传入的key值,获取Cookie中对应的value值
pop(key)通过传入的key值,删除Cookie中对应的value值
items()将Cookie中的值以“key:value”形式返回
values()获取Cookie中所有的value值
clear()清空当前站点Cookie中的内容
keys()获取Cookie中所有的key值
update()接收一个字典,根据接收的字典更新或添加到Cookie中
from flask import Flask, request, session
app = Flask(__name__)
app.secret_key = 'Your_seccret_key&^52@!'   		# 设置secret_key的值
@app.route('/index')
def index():if 'username' in session:return f'你好:{session.get("username")}'return '请登录'
@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':session['username'] = request.form['username'] # 设置session值return '登录成功'return '''<form method="post"><p><input type=text name=username><p><input type=submit value='登录'></form>'''
if __name__ == '__main__':app.run()

2.应用上下文

Flask的应用上下文包括current_app对象和g对象,其中current_app对象表示当前激活的Flask应用程序实例;g对象表示程序的一个全局临时变量,我们可以通过g对象在一次请求调用的多个函数间传递一些数据,每次请求都会重设这个变量。

from flask import Flask, current_app  # 导入current_app对象
app = Flask(__name__)
app.secret_key = 'Your_seccret_key&^52@!'
@app.route('/')
def index():return f'{current_app.secret_key}'   # 通过current_app对象获取密钥
if __name__ == '__main__':app.run()

g对象存储了一次请求的所有用户信息,例如,用户的登录信息、数据库的连接信息等,在同一个请求中,如果后续的代码中需要用户登录信息或数据库连接信息都可以通过g对象获取。当请求完成之后,g对象便会销毁;当发送一个新的请求时,g对象也会随之生成。

使用g对象模拟获取当前用户信息。

from flask import Flask, g
app = Flask(__name__)
@app.route('/')
def get_user():user_id = '001'            # 设置用户iduser_name = 'flask'        # 设置用户名称g.user_id = user_id      # 将用户id保存到g对象中g.user_name = user_name # 将用户名称保存到g对象中result = db_query()return f'{result}'
def db_query():user_id = g.user_id    # 使用g对象获取用户iduser_name = g.user_name  # 使用g对象获取用户名称return f'{user_id}:{user_name}'
if __name__ == '__main__':app.run()

2.4 处理响应

2.4.1 响应报文

在Flask程序中,浏览器发出的请求会触发相应的视图函数,并将视图函数的返回值作为响应体,之后生成完整的响应内容,即响应报文。响应报文主要由4个部分组成,分别是状态行、响应报头、空行以及响应体。

状态行主要由协议版本、状态码和原因短语组成,其中协议版本表示网站服务器使用的传输协议以及版本,例如HTTP/1.0;状态码表示响应内容的状态;原因短语是对状态码的简单说明。 状态码由三位数字组成,其中第1位数字表示响应的类别,它的取值为1~5,其中1xx代表请求已接收,需要继续处理;2xx代表请求已经成功被服务器接收、理解并接受;3xx代表客户端需要进一步细化请求,4代表客户端的请求有错误,5代表服务器出现错误。

状态码取值的说明。

状态码说明
100~199表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程
200~299表示服务器成功接收请求并已完成整个处理过程,常用的状态码为200,表示请求成功
300~399为完成请求,客户需进一步细化请求。例如,请求的资源已经移动到一个新地址,常用状态码包括302(表示所请求的页面已经临时转移至新的URL)、307和304(表示使用缓存资源)
400~499客户端的请求有错误,常用状态码包括404(表示服务器无法找到被请求的页面)和403(表示服务器拒绝访问,权限不够)
500~599服务器端出现错误,常用状态码为500,表示请求未完成,服务器遇到不可预知的情况

响应报头用于为客户端提供一些额外的信息,通过这些额外的信息可以告知客户端更多的响应信息,包括服务器的名称和版本、响应体的类型等信息。响应报头由多个字段与值组成,字段与值之间以冒号进行分隔。

响应报文中常见的字段说明。

字段说明
Age服务器从创建响应到当前持续的时间,单位为秒
Server服务器应用程序软件的名称和版本
Content-Type服务器发送的响应体的类型
Content-Encoding告知客户端采用哪种解码方式对响应体进行解码
Content-Length响应体的长度

Content-Type字段的常用取值为text/plain、text/html和application/json,分别表示响应内容是纯文本、HTML或JSON。

2.4.2 生成响应

Flask内部自动会该字符串转换成Response类的对象。在Flask中,Response类表示响应,它封装了响应报文的相关信息。如果希望在Flask程序中主动生成响应,一般可以通过Response类的构造方法或make_response()函数实现。

1.Response类的构造方法

Response类的构造方法的声明。

Response(response, status, headers, mimetype, content_type, direct_passthrough)

response:可选参数,表示视图函数返回的响应体。 status:可选参数,表示响应状态码。 headers:可选参数,表示响应报头。 mimetype:可选参数,表示响应体的MIME类型。 content_type:可选参数,表示响应体的类型。

以Response类的构造方法为例,为大家演示如何通过Response类的构造方法生成响应。

from flask import Flask, Response
app = Flask(__name__)
@app.route('/index')
def index():# 使用Response类的构造方法生成响应对象,设置状态码为201,响应类型为text/htmlresp = Response(response='基于Python的Flask服务器开发',status=201,content_type='text/html;charset=utf-8')return resp
if __name__ == '__main__':app.run()

2.make_response()函数

make_response()函数也用于生成响应,它可以接收str、bytes、dict和tuple共4种类型的参数,当参数的类型为tuple时,参数的值可以为(body, status, headers) 、(body, status)或 (body, headers)任意一种形式,其中body表示响应体,status表示状态码,headers表示响应报头,另外header的值可以是一个字典或(key,value)形式的元组。

演示如何通过make_response()函数生成响应。

from flask import Flask, make_response
app = Flask(__name__)
@app.route('/index')
def index():res = make_response('Python&Flask',201,{'content-type':' text/html;charset=utf-8'})return res
if __name__ == '__main__':app.run()

若视图函数返回的响应体为JSON格式的字符串,我们可以通过json模块将Python字典、列表或元组序列化为JSON格式的字符串,也可以通过Flask提供的便捷函数jsoinify(),jsonify()函数会将传入的参数序列化为JSON格式的字符串。两者的区别在于,前者会将响应类型设置为text/html,而后者会将响应类型设置为application/json。

演示如何通过make_response()函数生成JSON类型的响应数据。

from flask import Flask, make_response, jsonify
app = Flask(__name__)
@app.route('/response')
def resp():res = make_response(jsonify({'Python':'Flask'}),202)return res
if __name__ == '__main__':app.run()

2.5 URL反向解析

使用Flask开发程序时我们可以以硬编码的方式在程序中使用URL,但此种方式会使URL与程序具有较高的耦合度,当某个URL修改之后,程序中与之对应的URL都需要进行同步修改,这样不仅不利于URL的维护,还可能因为忘记修改URL导致程序出现错误。

flask.url_for模块中提供了URL反向解析的函数url_for(),该函数可以根据视图函数的名称获取对应的URL。

url_for(endpoint, values,_external,_scheme,_anchor,_method,**values)

endpoint:必选参数,表示反向解析的端点(用于标记一个视图函数以及对应的URL规则)名称,默认值为视图函数名。 values:可选参数,表示URL地址传递的参数。 _external:可选参数,表示是否供程序外部使用,默认值为False,若为True,则返回绝对URL地址,例如,http://127.0.0.1:5000/hello/flask。

使用url_for()函数对URL进行反向解析。

from flask import Flask, url_for
app = Flask(__name__)
@app.route('/hello/flask')
def greet():return f"{url_for('greet')}"   # 反向解析视图函数greet()对应的URL
if __name__ == '__main__':app.run()

若URL规则中包含要传递的参数,则调用url_for()函数时需要将该参数以关键字参数形式传递。

from flask import Flask, url_for
app = Flask(__name__)
@app.route('/hello/<name>')
def greet(name):return f"{url_for('greet',name=name)}"   
if __name__ == '__main__':app.run()

 

使用url_for()函数反向解析URL时,除了传递URL规则中的参数以外,还可以传递任何额外参数给URL地址的参数。

from flask import Flask, url_for
app = Flask(__name__)
@app.route('/hello/<name>')
def greet(name):# 将age=20添加到URL地址中return f"{url_for('greet',name=name, age=20)}"
if __name__ == '__main__':app.run()

多学一招:URL编码

URL编码是一种用于将URL中的非ASCII字符的特殊字符转换为可以为Web浏览器和服务器可以接受的字符。在Flask中,url_for()函数可以对URL地址中的一些特殊字符自动编码,例如,URL地址为/hello/zhangsan?addr=北京,url_for()函数会将其编码为/hello/zhangsan?address=%E5%8C%97%E4%BA%AC。

2.6 页面重定向

页面重定向在Web程序中非常普遍,例如,当用户在电商网站购买商品时,电商网站若检测到用户还未曾登录,则会将当前页面重定向到登录页面。在Flask程序中,页面重定向功能可以通过redirect()函数实现。

redirect(location, code=302, Response=None)

location:必选参数,表示重定向的URL地址。 code:可选参数,表示重定向状态码,默认状态码为302。 Response:可选参数,表示实例化响应时使用的Response类,若未指定默认使用的响应类为werkzeug.wrappers.Response。

通过一个用户登录的案例演示如何通过redirect()函数实现登录页面与欢迎页面的重定向,即当用户首次访问欢迎页面时,若session中还没有记录过这个用户名,则会将欢迎页面重定向到登录页面;当用户在登录页面输入用户名登录后,会将登录页面重定向到欢迎页面。

 

from flask import Flask, url_for, request, redirect, session
app = Flask(__name__)app.secret_key = 'Your_secret_key&^52@!'
@app.route('/index')
def index():if 'username' in session:return f'你好:{session.get("username")}'  # 返回欢迎信息return redirect(url_for("login"))  # 页面重定向到登录页面
@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':session['username'] = request.form['username']return redirect(url_for('index'))  # 页面重定向到欢迎页面# 当发送GET请求时,页面显示输入框和登录按钮return '''<form method="post"><p><input type=text name=username><p><input type=submit value=登录></form>'''if __name__ == '__main__':app.run()

多学一招:唯一的URL

在浏览器中访问某些页面时,我们可以看到有些页面的URL地址末尾包含“/”,有些URL地址末尾没有包含“/”,例如,http://127.0.0.1:5000/static/goods/和http://127.0.0.1:5000/static/goods,这两个地址从表面上看非常相似,但它们访问的结果是不同的,前者访问的是goods目录下的资源,比如book.jpg或tea.jpg文件,而后者访问的是goods资源。由此可见,http://127.0.0.1:5000/static/goods/和http://127.0.0.1:5000/static/goods是两个不同的URL地址。

当我们在Flask程序中注册路由时,若URL地址以“/”结尾,但用户请求相应页面时使用的URL地址末尾没有加“/”,则会将当前页面重定向到URL地址加“/”的同一页面。为了保持访问资源的URL唯一,使加“/”和不加“/”的URL地址能指向不同的资源,我们在注册路由时建议URL末尾不加“/”。

以@app.route(‘/static/goods’)和@app.route(‘/static/goods/’)为例,通过一张表来罗列末尾包含和不包含“/”的URL访问结果。

示例URL**地址**是否可访问
@app.route('/static/goods')http://127.0.0.1:5000/static/goods/不可以
@app.route('/static/goods')http://127.0.0.1:5000/static/goods可以
@app.route('/static/goods/')http://127.0.0.1:5000/static/goods/可以
@app.route('/static/goods/')http://127.0.0.1:5000/static/goods可以

2.7 本章小结

本章首先介绍了如何在Flask程序中注册路由并向URL中传递参数,然后介绍了Flask程序接收请求之后如何进行请求处理,接着介绍了如何在Flask程序中处理响应,最后介绍了URL反向解析和页面重定向。通过学习本章的内容,希望读者能够掌握Flask中路由的使用,为后续的学习奠定扎实的基础。

2.8 习题

一,填空题

1.Flask程序中可通过route()和()方法注册路由。

2.自定义转换器需要继承()。

3.自定义转换器定义完成之后,需要通过()将器添加到转换器字典中。

4.Flask程序中,URL字符串中使用()标识变量。

5.Flask中上下文分为请求上下文和()。

二,判断题

1.在Flask程序中,一个视图函数可以绑定多个URL规则。()

2.Flask的请求上下文包括request对象和g对象。()

3.使用jsonify()函数可以将响应数据序列化为JSON格式的字符串。()

4.Flask使用上下文临时保存程序运行过程中的一些信息。()

5.常用的会话跟踪技术有Cookie和Session。()

三,选择题

1.下列选项中,用于在使用add_url_rule()方法注册路由时设置端点名称的参数是()。

A.rule

B.endpoint

C.view_func

D.methods

2.下列选项中,用于匹配整型数据的内置转换器是()。

A.string

B.any

C.int

D.float

3.下列选项中,用于获取URL中请求参数的是()。

A.args

B.methods

C.cookies

D.data

4.下列选项中,表示请求成功的状态码是()。

A.100

B.200

C.301

D.400

5.下列选项中,用于从服务器请求某些资源的请求方式是()。

A.PUT

B.HEAD

C.POST

D.GET

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/458130.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字节跳动官方出品AI,白嫖使用GPT4!

关注我&#xff0c;紧跟本系列专栏文章&#xff0c;咱们下篇再续&#xff01; 作者简介&#xff1a;魔都技术专家兼架构&#xff0c;多家大厂后端一线研发经验&#xff0c;各大技术社区头部专家博主&#xff0c;编程严选网创始人。具有丰富的引领团队经验&#xff0c;深厚业务架…

AnimateDiffusion文字生成图片--入门

AnimateDiffusion文字生成图片--入门 1. 安装2. 插件2.1 汉化插件2.2 中文提示词插件2.3 模型下载插件2.4 模型下载2.5 c站helper插件2.6 c站秘钥 3. 模型4. 总结 gitio: https://a18792721831.github.io/ 下面基本上所有的操作都需要访问外网&#xff0c;请自行解决外网。 1. …

ROS笔记一:工作空间和功能包

目录 工作空间 如何创建工作空间&#xff1a; 编译工作空间 设置环境变量 功能包 创建功能包 CMakeLists.txt package.xml 工作空间 ROS的工作空间是用来存放工程文件代码的文件夹 ROS的开发依赖于工作空间&#xff0c;包括编写代码、编译等都是在工作空间下进行的 工作空…

vue electron应用调exe程序

描述 用Python写了一个本地服务编译成exe程序&#xff0c;在electron程序启动后&#xff0c;自动执行exe程序 实现 1. 使用node的child_process模块可以执行windows执行&#xff0c;通过指令调exe程序 // electron/index.js var cp require("child_process"); /…

【开源】SpringBoot框架开发城市桥梁道路管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥梁4.2 新增城市桥梁4.3 编辑城市桥梁4.4 删除城市桥梁4.5 查询单个城市桥梁 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的城市桥梁道路管理系统&#xff0c;支持…

跟着pink老师前端入门教程-day20

二、移动WEB开发之flex布局 1、flex 布局体验 1.1 传统布局与flex布局 传统布局&#xff1a;兼容性好、布局繁琐、局限性、不能再移动端很好的布局 flex弹性布局&#xff1a;操作方便&#xff0c;布局极为简单&#xff0c;移动端应用很广泛&#xff1b;PC 端浏览器支持情况…

archlinux 使用 electron-ssr 代理 socks5

提前下载好 pacman 包 https://github.com/shadowsocksrr/electron-ssr/releases/download/v0.2.7/electron-ssr-0.2.7.pacman 首先要有 yay 和 aur 源&#xff0c;这个可以参考我之前的博客 虚拟机内使用 archinstall 安装 arch linux 2024.01.01 安装依赖 yay 安装的&#…

辛芷蕾在《繁花》中美艳照人,实力打脸于正。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 在王家卫导演的电视剧《繁花》中&#xff0c;辛芷蕾饰演的李李…

容器化对数据库的性能有影响吗?

引言 容器化是一种将应用程序及其依赖项打包到一个独立、可移植的运行环境中的技术。容器化技术通过使用容器运行时引擎&#xff08;比如Docker/Containerd&#xff09;来创建、部署和管理容器。Kubernetes&#xff08;通常简称为 k8s&#xff09;是一个开源的容器编排和管理平…

数字图像处理(实践篇)四十七 OpenCV-Python 高动态范围HDR

目录 一 HDR 二 实践 高质量的图像具备的要素如下: ①分辨率 图像中的像素数量。在特定屏幕尺寸下,分辨率越高,像素越多,显示的细节更精细。 ②位深度

国密SM2算法进行数据的加密、签名和验签、解密

一、背景介绍 数据的加解密有很多种方式&#xff0c;几种常用的加密算法如下&#xff1a; DES&#xff08;Data Encryption Standard&#xff09;&#xff1a;对称算法&#xff0c;数据加密标准&#xff0c;速度较快&#xff0c;适用于加密大量数据的场合&#xff1b; 3DES&…

Leetcode—42. 接雨水【困难】

2024每日刷题&#xff08;112&#xff09; Leetcode—42. 接雨水 空间复杂度为O(n)的算法思想 实现代码 class Solution { public:int trap(vector<int>& height) {int ans 0;int n height.size();vector<int> l(n);vector<int> r(n);for(int i 0; …