Flask框架——路由:URL规则与视图函数

Flask - 路由系统 目录 一、基本使用 1-1 默认转换器 二、add_url_rule - 装饰器本质分析及使用 2-1 route装饰器 源码分析 2-1-1 add_url_rule使用效果测试 2-2 基于add_url_rule的CBV使用方式 2-2-1 方式一、继承view.View类 2-2-2 方式二、继承 views.MethodView 类 - 常用方式 2-3  app.ad... 阅读详情

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


Flask 框架学习目录


1. 概述

路由 是MVC架构的Web框架中相当重要的一个概念,也是本节课程的重点。顾名思意,路由就是在迷茫中找出一条路的意思。在Flask框架中,路由 就表示为用户请求的URL找出其对应的处理函数之意。

在本节课程,我们将主要从以下几个方面讲解Flask框架中的路由:

  • 如何为应用注册路由?

  • 如何为路由指定其支持的HTTP方法?

  • 如何匹配动态URL?

  • 如何对URL中的变量类型进行过滤?

  • 如何理解访问点/endpoint?

  • 如何为应用设定静态路由?

  • 如何避免硬编码指向其他视图的URL?

现在开始吧。

2. 注册路由

在Flask应用中,路由是指用户请求的URL与视图函数之间的映射。Flask框架 根据HTTP请求的URL在路由表中匹配预定义的URL规则,找到对应的视图函数, 并将视图函数的执行结果返回WSGI服务器:

可见路由表在Flask应用中处于相当核心的位置。路由表的内容是由应用开发者填充。

route装饰器 :可以使用Flask应用实例的route装饰器将一个URL规则绑定到 一个视图函数上。

例如,下面的示例将URL规则/test绑定到视图函数test()上:

@app.route('/test')
def test():
  return 'this is response'

Flask框架就会调用我们的test()函数,其返回结果就传递给WSGI服务器发送给访问者。

add_url_rule() :另一种等价的写法是使用Flask应用实例的add_url_rule()方法。 下面的示例注册了一个与前例相同的路由:

def test():
  return 'this is response'
app.add_url_rule('/test',view_func=test)

其实,route装饰器内部也是通过调用add_url_rule()方法实现的路由注册。 但是显然,使用装饰器使代码看起来更优雅一些。

实验代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask 
app = Flask(__name__)

@app.route('/')
def index():
    return '''
    <ur>
        <li><a href="/test">test</a></li>
        <li><a href="/friend">friend</a></li>
    </ur>
    '''

@app.route('/test')
def test():
    return 'this is response'

@app.route('/friend')
def friend():
    return '<h1>My Friend List</h1>'

app.run(host = '0.0.0.0', port = '8080')

实验页面如下:

3. 为路由指定HTTP方法

默认情况下,Flask路由仅支持HTTP的GET请求。可以使用methods关键字参数,在注册 路由时显式地声明视图方法支持的HTTP方法。

例如,下面的示例将URL规则/auth绑定到视图函数v_auth(),这个路由仅支持POST方法:

@app.route('/auth', methods = ['POST'])
def v_auth(): pass
3.1 指定多种HTTP方法支持

关键字参数methods的类型为list,因此可以同时指定多种HTTP方法。

下面的示例中,使URL规则/user同时支持POST方法和GET方法:

@app.route('/user', methods = ['POST', 'GET'])
def v_users():
  if request.method == 'GET':
    return ... # 返回用户列表
  else:
    return ... # 创建新用户

这个特性使Flask非常易于开发REST架构的后台服务,而不仅仅局限于传统的动态网页。

实验代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask 
app = Flask(__name__)

@app.route('/')
def index():
    return '''
        <form action="/auth" method="POST">
            <input type="text" name="uid">
            <input type="password" name="pwd">
            <input type="submit" value="submit">
        </form>
    '''
@app.route('/auth',methods=['POST'])
def v_auth():
    return '<h1>在这里做验证工作</h1>'   


app.run(host = '0.0.0.0', port = '8080')

实验页面如下:

4. 匹配动态URL

有时我们需要将同一类*URL映射到同一个*视图函数处理,比如,使用同一个视图函数 来显示不同用户的个人档案。我们希望以下的URL都可以分发到同一个视图函数:

在Flask中,可以将URL中的可变部分使用一对小括号<>声明为变量, 并为视图函数声明同名的参数:

@app.route('/user/<uname>')
def v_user(uname):
  return '%s\'s Profile' % uname

在上面的示例中,URL规则中的表示这部分是可变的,Flask将提取用户请求的 URL中这部分的内容,并作为视图函数v_user()的uname参数进行调用。

实验代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask 
app = Flask(__name__)

@app.route('/')
def index():
    return '''
    <ur>
        <li><a href = "/user/Mary/friend/Linda">here</a></li>
    </ur>
    '''

@app.route('/user/<uname>/friend/<fname>')
def u_f(uname, fname):
    return '%s\'s friend - %s\'s profile' % (uname, fname)

app.run(host = '0.0.0.0', port = '8080')

实验页面如下:

5. URL变量类型过滤

考虑下面的示例,我们希望通过HTTP共享文件夹./var/readonly中的文件:

/var
 /readonly
   /a.txt
   /b.txt
   /repo
     /c.txt
     /d.txt

简单思考一下就有答案了。我们可以构造URL规则/file/,然后直接 读取文件内容返回给用户。注册如下的路由:

@app.route('/file/<fname>')
def v_file(fname):

    fullname = os.path.join('./var/readonly/',fname)
    #print fullname
    f = open(fullname, 'r')
    data = f.readlines()
    f.close()
    return "%s" % data

测试结果表明,/file/a.txt和/file/b.txt都没有问题,但是/file/repo/c.txt和 /file/repo/d.txt却会失败。

127.0.0.1 - - [03/Nov/2016 20:15:01] "GET /file/a.txt HTTP/1.1" 200 -
127.0.0.1 - - [03/Nov/2016 20:21:18] "GET /file/b.txt HTTP/1.1" 200 -
127.0.0.1 - - [03/Nov/2016 20:21:24] "GET /file/repo/c.txt HTTP/1.1" 404 -

这是因为,默认情况下,在URL规则中的变量被视为不包含/的字符串。/file/repo/c.txt 是没有办法匹配URL规则/file/的。

可以使用内置的path转换器告诉Flask框架改变这一默认行为。path转换器允许 规则匹配包含/的字符串:

@app.route('/file/<path:fname>')

在Flask中,转换器/converter用来对从URL中提取的变量进行预处理,这个过程 发生在调用视图函数之前。Flask预置了四种转换器:

  • string - 匹配不包含/的字符串,这是默认的转换器
  • path - 匹配包含/的字符串
  • int - 只有当URL中的变量是整型值时才匹配,并将变量转换为整型
  • float - 只有当URL中的变量是浮点值时才匹配,并将变量转换为浮点型

6. 访问点/endpoint

我们一直强调,路由的作用是根据请求的URL,找到对应的视图函数。这没错,但是在 Flask框架中,请求任务的分发并不是直接从用户请求的URL*一步定位到视图函数, 两者之间隔着一个访问点/endpoint*。

以下面的代码为例,我们看Flask怎样实现请求的分发:

@app.route('/home')
def home(): pass

在Flask内部使用两张表维护路由:

  • url_map :维护URL规则和endpoint的映射
  • view_functions :维护endpoint和视图函数的映射。

以用户访问URL*/home*为例,Flask将首先利用url_map找到所请求URL对应的 endpoint,即访问点home,然后再利用view_functions表查找home这个访问点 对应的视图函数,最终匹配到函数home():

默认访问点 :当我们使用route装饰器注册路由时,默认使用被装饰函数的 函数名(name)作为访问点,因此,你看到上面的表中,路由中的访问点为home。

自定义访问点 :可以在使用route装饰器或调用add_url_rule()方法注册路由时,使用 endpoint关键字参数改变这一默认行为:

@app.route('/home',endpoint='whocare')
def home():pass

此时的两张路由表将变成这样:

7. 静态目录路由

当创建应用实例时,Flask将自动添加一条静态目录路由,其访问点 始终被设置为static,URL规则默认被设置为/static,本地路径默认被 设置为应用文件夹下的static子文件夹:

+------------------------------------------------------------+
| url rule | endpoint | view_function |
|------------------------------------------------------------|
| /static | static | Flask.send_static_file |
+------------------------------------------------------------+

如果你的应用目录如下:

/app
 /web.py
 /static
   /main.css
   /jquery.min.js 

那么启动应用后就可以通过URL*/static/main.css*访问static文件夹下的main.css了。

除了访问点被固定为static,静态目录的URL规则和本地目录都是可以根据应用情况进行调整。

改变默认的本地路径 :可以在创建应用对象时使用关键字参数static_folder改变 默认的静态文件夹。例如,你的静态文件都存放在应用下的assets目录下, 那么可以按如下的方式创建应用对象:

app = Flask(__name__,static_folder='assets')

也可以使用一个绝对路径:

app = Flask(__name__,static_folder='/var/www/static')

改变默认的本地路径并不会对路由表产生影响。

改变默认的URL规则 : 如果不喜欢静态目录URL*/static*,也可以在创建应用 对象时使用关键字参数static_url_path换一个别的名字。
下面的示例中,将应用下的assets文件夹注册为静态目录/assets:

app = Flask(__name__,static_folder='assets',static_url_path='/assets')

当应用运行后,通过URL*/assets/main.css*就可以访问assets文件夹下的 main.css文件了。

这时的路由表变化为:

+------------------------------------------------------------+
| url | endpoint | view_function |
|------------------------------------------------------------|
| /assets | static | Flask.send_static_file |
+------------------------------------------------------------+

8. 构造URL

在一个实用的视图中,不可避免地存在指向其他视图的链接。在之前的课程示例中,我们 都是在视图函数中这样硬编码这些链接URL的:

@app.route('/')
def v_index():
   return '<a href="/tech">tech</a>'
@app.route('/tech') 
def v_tech():pass

大部分情况下这种硬编码URL是可以工作的。但如果这个应用被挂在WSGI服务器的一个 子路径下,比如:/app1,那么用户访问URL*/tech*是不会成功的,这时应当访问/app1/tech 才可以正确地路由到视图函数v_tech()。

我们应当使用访问点让Flask框架帮我们计算链接URL。简单地给url_for()函数传入 一个访问点,它返回将是一个可靠的URL地址:

@app.route('/')
def v_index():
 print url_for('v_contacts') # /contact
 return 'see console output!'
@app.route('/contact')
def v_contacts():pass

添加查询参数 : 使用关键字参数,可以在构造的URL中生成查询串。下面的调用将生成 /contact?format=json

@app.route('/')
def v_index():
 print url_for('v_contacts',format='json')
 return ''
@app.route('/contact') 
def v_contacts():pass

添加URL变量 : 如果指定访问点对应的视图函数接收参数,那么关键字参数将生成对应的参数URL。下面的 示例将生成/contact/Julia?format=html:

@app.route('/')
def v_index():
 print url_for('v_contact',name='Julia',format='html')
 return ''
@app.route('/contact/<name>')
def v_contact(name):pass

添加锚点 :使用_anchor关键字可以为生成的URL添加锚点。下面的示例将生成URL /contact#part2

@app.route('/')
def v_index():
 print url_for('v_contacts',_anchor='part2')
@app.route('/contact')
def v_contacts():pass

外部URL : 默认情况下,url_for()生成站内URL,可以设置关键字参数_external 为True,生成包含站点地址的外部URL。下面的示例将生成URL*http://

@app.route('/')
def v_index():
 print url_for('v_contacts',_external=True)
@app.route('/contact')
def v_contacts():pass

Reference:

flask框架

flask路由参数 路由中带参数的请求,从客户端或者浏览器发过来的请求带参数。 基本使用: @blue.route('/getstudents/<id>/') def getstudents(id): return '学生%s'+id 基础语法 converter:var_name 书写的converter可以省略,默认类型就是string conver... 阅读详情

相关推荐

Flask 后端开发:路由与视图函数的巧妙运用

URL匹配:将用户请求的URL(如/blog/1)与预定义的路由规则(如)匹配;逻辑分发:根据匹配结果,调用对应的视图函数处理请求;响应生成:视图函数生成响应(HTML、JSON、文件等),返回给用户。未解决这些问题前,开发者需手动解析URL、判断请求方法(GET/POST),代码会变得冗长且难以维护。Flask的路由与视图系统将这些逻辑抽象化,让开发者专注于业务逻辑。装饰器是Flask中扩展视图函数的强大工具,可用于添加权限检查日志记录缓存等功能。例如,创建一个步骤1:定义装饰器。

AI架构全栈开发实战笔记 866

python flask web开发入门与项目实战

        Web网站发展至今,特别是服务器端,涉及的知识非常广泛,这对程序员的要求会越来越高。如果采用成熟、稳健的框架,那么一些诸 如安全性、数据流控制等类型的基础性工作都可以让框架来处理,而程序开发人员则可以把更多的精力放在具体业务逻辑功能的实现和优化上。        使用Flask框架的优势有以下几点:        可以大大降低开发难度,提高开发效率,让快速、高效的Web开发成为可能。        可以带来系统稳定性和可扩展性的提升。Flask自由、灵活、可扩展性强、第三方库的选择面广,用第三方库可以实现自己想要的功能,而且很多第三方库还可以定制与裁减。       对于初学者来说简单易学,入门门槛很低,即便没有多少Web开发经验,也能很快做出网站,大大节约了初学者的学习成本。      综上所述,Flask 是一个用Python语言编写的Web微框架,可以让开发人员快速开发各种Web应用       课程预计每周更新两节

第2章 路由

掌握注册路由的方式,能够独立完成路由的注册掌握URL传递参数的方式,能够通过URL规则向视图函数传递参数掌握转换器用法,能够根据业务需求灵活应用内置转换器或自定义转换器掌握指定请求方式,能够在注册路由时指定请求方式掌握请求钩子,能够在程序中灵活运用请求钩子掌握上下文,能够通过上下文处理程序中的请求了解响应报文,能够说出响应报文的组成部分及其作用掌握响应的创建方式,能够灵活通过make_response()函数生成响应掌握URL反向解析,能够通过url_for()获取反向解析的URL。

笔触狂放的博客 1338

Flask框架中add_url_rule与app.route用法

Flask框架中add_url_rule与app.route用法

IT之一小佬的博客 3982

ArcGIS实战:用栅格数据为偏远山区规划一条最省钱的公路(附完整数据与操作步骤)

本文详细介绍了如何利用ArcGIS进行栅格数据分析,为偏远山区规划一条最省钱的公路。通过DEM高程数据处理、成本权重设定和最佳路径计算,结合真实案例展示了从数据准备到工程方案转化的完整流程,帮助工程师在复杂地形中做出经济高效的路线决策。

weixin_32136203的博客 357

Palantir Vertex:数字孪生模拟与决策系统深度指南

Palantir Vertex是Foundry系统中的核心数字孪生模块,本质上是一个决策模拟器而非简单的数据可视化工具。它基于本体层构建,通过对象关系网络模拟现实世界实体,填补数据模型与业务决策间的鸿沟。核心功能包括:创建隔离的沙盒场景进行假设测试、修改参数模拟不同干预方案、对比虚实数据发现异常,并最终将最优决策回传至业务系统。典型应用场景涵盖供应链韧性评估、资产维护优化和应急方案制定等,帮助用户在复杂环境中做出更优决策。

轩哥的个人研究和成长记录 891

flake的路由表述方式

在Flask中定义URL路由规则有三种方法: 1、使用flask.Flask.route()装饰器 2、使用flask.Flask.add_url_rule函数 3、直接访问底层的Werkzeug路由系统:flask.Flask.url_map 下面就第1,2两种方法进行讲解: flask.Flask.route()装饰器的函数原型为:route(rule, **options) fl

thone00的博客 407

手把手排查IOMMU映射故障:从内核日志到硬件寄存器调试全指南

本文详细解析了IOMMU映射故障的排查方法,从内核日志分析到硬件寄存器调试,提供了一套完整的诊断流程。涵盖AMD和Intel平台的特定调试技巧,包括ATS协商失败、DMA传输错误等常见问题的解决方案,并介绍了高级调试工具链的搭建与性能优化策略。

weixin_42666036的博客 356

二、Falsk的路由和变量规则

Falsk的路由和变量规则

hanyuxiyan的博客 145

Zlib1.2.11源码编译(Win10+VS2019)

下载 下载网址: zlib Home Site 得到文件: 解压缩到“D:\SourceCodes\zlib-1.2.11” 使用CMake配置、生成并打开项目 将CMakeLists.txt拖入CMake,配置(Configure): 生成(Generate) 打开项目(Open Project),CMake调用VS2019打开项目 生成debug版本 构建项目ALL_BUILD。成功生成debug版本 在“D:\Sourc...

Alexabc3000的专栏 1893

基于YOLOv8和PaddlepaddleOCR的微信截图聊天记录提取

本文提出了一种基于YOLOv8和PaddleOCR的微信聊天记录提取方法。首先使用YOLOv8n模型分割出聊天气泡(针对深浅色模式分别训练),通过合成数据集增强模型鲁棒性,召回率达0.995。随后采用PP-OCRv5进行文本识别,利用坐标匹配将气泡内文本送入识别队列,短长文本平均置信度分别>0.98和>0.95。文中特别强调了PaddleOCR不同版本的输出格式差异及适配方案,建议使用3.0+版本。该方法有效解决了直接OCR识别易受干扰的问题,通过气泡分割+文本定位的两阶段策略显著提升了识别准确

2401_87383958的博客 2358

Flask(三)路由与视图函数

访问 http://127.0.0.1:5000/files/docs/python.pdf,返回 "File path: docs/python.pdf"。访问 http://127.0.0.1:5000/submit 时,默认返回 "Submit a form using POST"。访问 http://127.0.0.1:5000/price/9.99,返回 "Price: $9.99"。访问 http://127.0.0.1:5000/post/123,返回 "Post ID: 123"。

网络风云的博客 1万+

2 君正底层API接口的封装1

君正的IPC芯片主要有T31、T40、T41等型号,每个型号的API接口大部分是相同的,但也存在一些不一致和差异化的地方。为了屏蔽不同芯片型号之间的差异,我们需要基于一个公共基类进行封装。在封装之前,我们需要定义自己的错误码和数据结构,用于屏蔽不同君正芯片的实现细节。为了确保整个IPC库使用统一的错误码,我们在HP_MPPErrorCode.h文件中专门定义了以下错误码。错误码囊括了参数错误、内存错误、溢出错误、不支持、密码错误、非法数据等各种异常情况。

hope_wisdom的技术博客 1588

Flask 路由装饰器:从 URL 到视图函数的优雅映射

Flask 的路由装饰器 @app.route 是 Flask 框架中用于将 URL 路径与视图函数绑定的核心工具。它通过 app.add_url_rule() 方法将 URL 规则注册到 url_map 中,并在请求处理阶段通过 url_map 匹配 URL 并执行相应的视图函数。路由装饰器支持静态路径、动态参数捕获、多种 HTTP 方法以及通过蓝图(Blueprints)实现模块化路由管理。这些功能使得 Flask 能够优雅地处理复杂的 URL 映射,适用于从简单页面到大型项目的各种场景。

人非生而知之者 1535

【ChangeCLIP】Remote sensing change detection with multimodal vision-language representation learning

ChangeCLIP论文及代码使用详解。持续更新变化检测最新论文,欢迎订阅本专栏。

向上生长的程序媛的博客 1337

AUTOSAR进阶图解==>AUTOSAR_SWS_ECUStateManager

AUTOSAR ECU State Manager 摘要 AUTOSAR ECU状态管理器(EcuM)是Classic Platform 4.4.0规范中的核心模块,负责管理ECU的整个生命周期,包括启动、运行、关机和睡眠等状态转换。EcuM通过协调各基础软件模块的初始化过程,确保系统可靠运行。 主要功能包括: 启动管理 - 控制从硬件初始化到应用运行的完整启动序列 状态转换 - 管理RUN/POST_RUN/SHUTDOWN等状态切换 唤醒验证 - 区分真实与虚假唤醒事件 关机序列 - 确保安全关机保存关

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 2473

【实战Flask API项目指南】之三 路由和视图函数

关于使用flask搭建后端api平台的路由和视图函数,超干货!!!

苟日新,日日新,又日新!!! 1976

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Flask学习与项目实战2:url与视图函数映射、视图转url

url与视图的函数映射 访问book/list的url的时候发现是不可以访问的,因为我们返回额不是字典、元组等等,现在返回的是一个列表。 TypeError: The view function did not return a valid response. The return type must be a string, dict, tuple, Response instance, or WSGI callable, but it was a list. 翻译:该视图没有返回一个可以响应的类型,如字

努力才是唯一的入场券。 4万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

测试开发——flask视图函数与路由 实战重点

flask视图函数与路由一、视图函数与路由 实战重点1.1 一个视图函数可以绑定多个URL地址1.2 视图装饰器应该放到最外层1.3所实现的装饰器要返回视图函数的返回值二、动态路由参数 https://blog.youkuaiyun.com/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请注明出处(如不注明,盗者必究) 一、视图函数与路由 实战重点 1.1 一个视图函数可以绑定多个URL地址 1.2 视图装

宝藏女孩的成长日记 2349

1 Flask路由和试图函数

在 Flask 中,路由和视图函数是构建 Web 应用的核心。本文将深入探讨 Flask 的路由和视图函数,涵盖 URL 路由规则、视图函数编写、HTTP 方法以及 URL 构建等内容,帮助你掌握 Flask Web 开发的基础。Flask 的路由和视图函数是构建 Web 应用的基础。通过理解 URL 路由规则、视图函数编写、HTTP 方法以及 URL 构建,你可以轻松创建各种 Web 应用。Flask 提供了多种变量类型转换器,可以将 URL 中的字符串转换为特定的 Python 数据类型。

wujianyouhun的专栏 1102

第2课、Flask 路由与视图函数详解

本文介绍了Flask框架中的路由系统核心概念与应用方法。主要内容包括:基础路由定义、多路由绑定技巧、动态路由参数类型转换(string/int/float/path等)、HTTP方法绑定(GET/POST/PUT/DELETE)、URL反向构造(url_for)与跳转技术。文章还提供了推荐的项目结构,涵盖视图函数、模板、静态文件等模块的组织方式。通过完整示例代码展示了如何构建一个包含多种路由功能的Flask应用,适合开发者系统学习Flask路由机制。

Melon的博客 1188

Flask 路由

Flask 路由是 Web 应用程序中将 URL 映射到 Python 函数的机制。Flask 路由是 Flask 应用的核心部分,用于处理不同 URL 的请求,并将请求的处理委托给相应的视图函数。以下是关于 Flask 路由的详细说明,包括路由的定义、参数、方法和规则等。基本路由定义:from flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'Welcome to the Home Page

zhao1iyong的博客 1911

flask——3:路由与视图

路由、视图、模板配合才能完成最完整的请求响应过程。

dangfulin的博客 1005

Flask—视图函数的路由规则设置说明

Flask是一款轻量级的web框架,只提供web框架的核心功能,具有自由、灵活、高度定制的特点。 # 第一个Flask的例子 from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "Hello, Flask!" if __name__ == "__main__": a...

weixin_41599977的博客 880

flask教程3:视图函数的路由

flask教程3:视图函数的路由

总裁余(余登武)博客 1098
上一篇: Flask框架——快速入门
下一篇: Flask框架——模板:分离数据与视图
coderpai
博客等级 码龄10年 1082粉丝 469原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值