iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python中flask 常见问题
  • 107
分享到

python中flask 常见问题

常见问题pythonflask 2023-01-31 01:01:03 107人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

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

1、改变默认的本地路径

  1. 可以在创建应用对象时使用关键字参数static_folder改变 默认的静态文件夹。

  2. 例如,你的静态文件都存放在应用下的assets目录下, 那么可以按如下的方式创建应用对象:

  3. app = flask(__name__,static_folder='assets',template_folder='template')

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

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

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

  7. 改变默认的URL规则 : 如果不喜欢静态目录URL/static,也可以在创建应用 对象时使用关键字参数static_url_path换一个别的名字。

  8. 下面的示例中,将应用下的assets文件夹注册为静态目录/assets:

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

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

2、设置端口号,打出debug

  1. if __name__ == '__main__':

  2. app.run(host='0.0.0.0', port=5001, debug=True)

3、添加URL变量

  1. 如果指定访问点对应的视图函数接收参数,那么关键字参数将生成对应的参数URL。

  2. 下面的 示例将生成/contact/Julia?fORMat=html

  3. @app.route('/')

  4. def v_index():

  5. print url_for('v_contact',name='Julia',format='html')  #  /contact/<name>

  6. return ''

  7. @app.route('/contact/<name>')

  8. def v_contact(name):pass

  9. </name>

4、添加锚点

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

  2. @app.route('/')

  3. def v_index():

  4. print url_for('v_contacts',_anchor='part2')

  5. @app.route('/contact')

  6. def v_contacts():pass

5、外部URL

  1. 默认情况下,url_for()生成站内URL,可以设置关键字参数_external 为True,生成包含站点地址的外部URL。

  2. 下面的示例将生成URLHttp://<x.y.z>/contacts:

  3. @app.route('/')

  4. def v_index():

  5. print url_for('v_contacts',_external=True)

  6. @app.route('/contact')

  7. def v_contacts():pass

6、Request对象

  1. Request实例对象中包含 了关于一次HTTP请求的一切信息,常用的属性包括:

  2. form - 记录请求中的表单数据。类型:MultiDict

  3. args - 记录请求中的查询参数。类型:MultiDict

  4. cookies - 记录请求中的cookie。类型:Dict

  5. headers - 记录请求中的报文头。类型:EnvironHeaders

  6. method - 记录请求使用的HTTP方法:GET/POST/PUT....。类型:string

  7. environ - 记录WSGI服务器转发的环境变量。类型:Dict

  8. url - 记录请求的URL地址。类型:string

  9. 关于Request类的详细信息,可以查阅 Flask官网

  10. 在视图函数中,可以直接使用全局对象request访问当次请求对应的Response对象。 下面的示例打印当前请求的全部报文头信息:

  11. @app.route('/')

  12. def index():

  13. print request.headers

  14. return 'see console output'

  15. 比如,如果想获取cookie,可以用 request.headers['Cookie'] 来获取

7、读取表单数据(POST方式提交)

  1. Flask框架将用户使用POST方法提交的表单数据,存储在所创建Request对象的 form属性中。

  2. form是一个MultiDict类型的对象,和Dict类似,我们可以使用[]操作符读取 指定的键值:

  3. @app.route('/')

  4. def v_index():

  5. uid = request.form['uid']

  6. pwd = request.form['pwd']

  7. return  'uid : %s pwd : %s' % (uid,pwd)

  8. 除了form属性,也可以使用Request对象的values属性来读取表单值,用法相同。

8、读取查询参数(GET方式提交)

  1. 对于浏览器以GET方法提交的表单数据,Flask框架将其存储在Request实例对象的args 属性中。

  2. 和form属性一样,args属性也是一个MultiDict类型的对象,因此我们可以是用[]操作 符读取指定键值:

  3. @app.route('/search')

  4. def v_search():

  5. q = request.args['q']

  6. return 'you are searching %s' % q

  7. 除了args属性,也可以使用Request对象的values属性来读取查询参数。

9、读取JSON数据

  1. 在REST架构中,前端经常使用ajax提交jsON数据:

  2. //javascript code in browser

  3. $.ajax({

  4. url : "/user",

  5. method : "POST",

  6. data : JSON.stringify(jsondata),

  7. contentType : "application/json;charset=UTF-8",

  8. success : function(){},

  9. error : function(){}

  10. });

  11. 如果前端在提交JSON数据时,正确设置了mimetype为application/json, 那么Flask框架会将其存储在Request实例对象的json属性中。

  12. 根据所提交的JSON数据的具体情况,Request对象的json属性值为自动转换后的 的字典或数组

  13. @app.route('/')

  14. def v_index():

  15. print request.json #字典或数组

  16. return 'see console output'

10、响应 :Response

  1. 与Request类相对应,Flask框架使用Response类表征对HTTP请求的响应。

  2. 根据视图函数的返回结果,Flask确保向后续处理环节传递一个正确的Response实例对象。 这有几种可能性:

  3. 视图函数返回字符串 :当视图函数返回的是一个字符串时,Flask自动使用 这个字符串作为正文内容,

  4. 以200作为状态码,以text/html作为mimetype,构造 一个Response对象传递给后续处理环节。

  5. 下面的示例中,视图函数v_ping()返回一个字符串:

  6. @app.route('/ping')

  7. def ping():

  8. return 'pong'

  9. Flask框架将基于这个返回结果构造如下的Response对象:

  10. response : ['pong']

  11. status_code : 200

  12. mimetype : 'text/html'

  13. 视图函数返回元组 :当视图函数返回的是一个形式如(response,status,headers)的元组时,

  14. Flask自动根据这几个值构造一个Response对象。

  15. 下面的示例中,视图函数v_ping()返回一个包含响应正文、状态码和包头的元组:

  16. @app.route('/ping')

  17. def v_ping():

  18. return 'pong',200,{'x-tag':'sth. magic'}

  19. Flask框架将基于这个返回结构构造如下的Response对象:

  20. response: ['pong']

  21. status_code : 200

  22. mimetype : 'text/html'

  23. headers : [('x-tag','sth. magic')]

  24. 视图函数返回Response对象 :当视图函数返回的是一个Response对象时,Flask 框架直接将这个对象向后续处理环节传递:

  25. from flask import Flask,make_response

  26. @app.route('/ping')

  27. def v_ping():

  28. rsp = make_response('pong')

  29. rsp.mimetype = 'text/plain'

  30. rsp.headers['x-tag'] = 'sth. magic'

  31. return rsp

  32. make_response()函数用来构造一个Response对象,第一个参数为响应的正文。

11、设置cookie

  1. 使用Response类的set_cookie()方法可以设置客户端cookie:

  2. Response.set_cookie(

  3. key,            //键

  4. value='',       //值

  5. max_age=None,   //秒为单位的cookie寿命,None表示http-only

  6. expires=None,   //失效时间,datetime对象或unix时间戳

  7. path='/',       //cookie的有效路径

  8. domain=None,    //cookie的有效域

  9. secure=None,

  10. httponly=False)

  11. 显然,如果要设置cookie,我们必须自行构造Response对象,而不是交给Flask框架去 完成这件事情。

  12. 下面的示例在访问首页/时设置cookie,并在访问/page2时读取cookie:

  13. @app.route('/')

  14. def index():

  15. rsp = make_response('Go <a href="%s">page2</a>' % '/page2')

  16. rsp.set_cookie('user','JJJJJohnny')

  17. return rsp

  18. @app.route('/page2')

  19. def page2():

  20. user = request.cookies['user']

  21. return 'you are %s' % user

12、构造JSON响应

  1. 在Flask中,可以使用json模块的dumps()方法将数组或字典对象转换为JSON字符串:

  2. from flask import json

  3. a = [1,2,3]

  4. print json.dumps(a) # '[1,2,3]'

  5. b = {'x':1,'y':2}

  6. print json.dumps(b) # '{"x":1,"y":2}'

  7. 这在开发REST api时相当有用。比如我们定义获得用户列表的API为GET /user:

  8. @app.route('/user')

  9. def v_users():

  10. users = ['Linda','Marion5','Race8']

  11. return json.dumps(users),200,[('Content-Type','application/json;charset=utf-8')]

  12. 为了向客户端正确标示响应的类型,我们在视图函数返回时使用了元组,在响应报文头/headers中添加了Content-Type字段,

  13. 并设置响应正文类型为application/json。


13、重定向响应

  1. 使用flask框架的redirect()方法,可以要求客户端进行重定向:

  2. flask.redirect(location, code=302, Response=None)

  3. redirect()方法其实是构造了一个具有重定向状态码的Response对象。重定向状态码 默认为302,这表示一个临时性重定向。

  4. redirect()方法还支持以下重定向状态码:

  5. 301 - 请求的网页已被永久移动到新位置

  6. 302 - 服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

  7. 303 - 对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI

  8. 305 - 请求者只能使用代理访问请求的网页。

  9. 307 - 对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求

  10. 下面的示例中,当用户访问首页时,将自动重定向到新手页/newbies:

  11. @app.route('/')

  12. def v_index():

  13. return redirect('/newbies')

  14. @app.route('/newbies')

  15. def v_newbies():

  16. return 'this page is for newbies only!'


14、终止响应

  1. 可以使用flask框架的abort()方法通知框架终止处理当前响应:

  2. flask.abort(code)

  3. abort()方法的code参数用来指定返回给客户端的HTTP状态码。由于abort()方法 将抛出HttpException异常,

  4. 因此它之后的代码不会被执行。

  5. 下面的示例中,要求访问/admin时必须附加查询参数token,否则返回HTTP 状态码401,提醒用户没有权限:

  6. @app.route('/admin')

  7. def v_admin():

  8. if 'token' in request.args:

  9. return 'you are a good boy.'

  10. else:

  11. abort(401)

15、session(会话) : 访问者上下文

  1. 会话/Session是为WEB服务器建立状态的一个成熟模式。会话主要解决两个问题:

  2. 访问者的标识问题

  3. 服务器需要识别来自同一访问者的请求。这主要是通过浏览器的cookie实现的。

  4. 访问者在第一次访问服务器时,服务器在其cookie中设置一个唯一的ID号——会话ID。

  5. 这样,访问者后续对服务器的访问头中将自动包含该信息,服务器通过这个ID号,即可区 隔不同的访问者。

  6. Flask框架中,每当一个请求进来时会自动根据请求中cookie的会话ID创建 一个Session类的实例对象。

  7. 你可以查看当前请求的cookie验证这一点(会话ID的键 默认为session):

  8. @app.route('/')

  9. def v_index():

  10. return request.cookies['session']

  11. 访问者信息的记录问题

  12. 服务器可以记录、提取指定访问者的历史信息。对每一个会话ID,服务端维护一个 数据上下文,

  13. 这个数据运行在内存中,通常在变化时持久化到文件系统中或数据库中。

  14. 在视图函数内,Flask提供了一个全局对象session,它始终等效于当前请求所对应的 Session类实例对象。

  15. Session类定义了get_item()方法和set_item()方法, 因此我们可以像使用Dict对象一样,

  16. 通过[]操作符读取或设置会话变量:

  17. @app.route('/')

  18. if !session['user']:

  19. return redirect('/login')

  20. return 'some restricted for authorized users only'

  21. 由于默认情况下,Flask将会话对象加密后存储在客户端的cookie里,

  22. 因此必须要为应用实例的secret_key属性配置一个加密种子才能使用session:

  23. app.secret_key = 'sth. random as a encrypt key.'

16、伪造请求上下文

  1. 有一种场景特别需要伪造请求上下文 —— 自动测试

  2. @app.route('/genius')

  3. def genius():

  4. return 'nothing special'

  5. with app.test_request_context('/genius',method='GET'):

  6. print app.dispatch_request()

17、生命周期

  1. Flask框架在一次请求应答的生命周期中,提供了一些方便的装饰器以便开发者可以 在合理的时间点注入一些定制化的代码:

  2. before_first_request()

  3. 被装饰的函数将在应用启动后,处理第一个请求之前被调用

  4. before_request()

  5. 被装饰的函数将在处理请求之前被调用

  6. after_request(response)

  7. 被装饰的函数将在处理请求之后被调用,调用时前序环节生成的Response 对象将作为参数传入。

  8. 被装饰的函数需要返回一个Response对象以作为后续环节的处理对象。

  9. 需要指出的是,如果在前序环节dispatch_request()处理请求时发生异常,after_request装饰 器装饰的函数可能被跳过。

  10. teardown_request(exception)

  11. 被装饰的函数将在请求上下文对象出栈之前被调用。

  12. 和after_request不同,即使前序环节发生异常,Flask保证这个函数总能被调用。因此,清理 性质的代码应当放置在此处。

  13. teardown_appcontext(exception)

  14. 被装饰的函数将在应用上下文对象出栈之前被调用。应用上下文总是和请求上下文一起出入栈。

本文出自https://blog.csdn.net/qq_33020901/article/details/69802445

--结束END--

本文标题: python中flask 常见问题

本文链接: https://www.lsjlt.com/news/184754.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python中flask 常见问题
    1、改变默认的本地路径可以在创建应用对象时使用关键字参数static_folder改变 默认的静态文件夹。例如,你的静态文件都存放在应用下的assets目录下, 那么可以按如下的方式创建应用对象:app = Flask(__name__,s...
    99+
    2023-01-31
    常见问题 python flask
  • Python常见问题
    什么是 Python? Python 是一种解释性、交互式、面向对象的编程语言。 它包含了模块、异常、动态类型、非常高层级的动态数据类型以及类的概念。 Python结合了超强的功能和极清晰的语法。 它带有许多系统调用和库以及各种窗口系统...
    99+
    2023-01-31
    常见问题 Python
  • zabbix常见问题
    zabbix常见问题 一.Zabbix服务器启动失败 ​ Zabbix服务器启动失败可能有多种原因,以下是一些常见的问题和解决方法: 1.1常见的问题 ​ 数据库连接问题:如果Zabbix无法连接到数...
    99+
    2023-09-11
    zabbix 服务器 数据库
  • K3常见问题
    金碟K3安装时常见的问题       关于Automation错误的成因也是多方面的,最多的是支持软件如:WINDOWS文件、系统控件等,都有可能导致问题的出现。当然,K/...
    99+
    2023-01-31
    常见问题
  • php常见问题
    列举一些 PHP 中的设计模式? 单例模式:保证在整个应用程序的生命周期中,单例类的实例只存在一个 工厂模式:定义一个创建对象的接口,让子类去实例化具体类。 观察者模式 发布/订阅模式:当一个对象状态发生变化时,依赖它的对象全部会收到通知,...
    99+
    2023-09-03
    单例模式 php 安全
  • mysql 常见问题
    事务级别 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。Read Uncommi...
    99+
    2022-10-18
  • MySQL——常见问题
      NULL和空值的区别 空值不占空间,NULL值占空间。当字段不为NULL时,也可以插入空值。 当使用 IS NOT NULL 或者 IS NULL 时,只能查出字段中没有不为NULL的或者为 NULL 的,不能查出空值。 判断NULL ...
    99+
    2023-09-29
    mysql 数据库
  • WindowsRT8.1:常见问题
    以下是Windows RT 8.1的常见问题:1. Windows RT 8.1是什么?Windows RT 8.1是一种针对平板电...
    99+
    2023-09-08
    Windows
  • Python中怎么处理常见报错问题
    这篇文章主要介绍Python中怎么处理常见报错问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先是常见的语法错误。2.然后是基础语法中的常见异常。3.最后是操作文件过程中的常见异常,这部分也是重难点知识。这是我们...
    99+
    2023-06-26
  • Python基础常见问题总结(一)
    1.__ foo 、foo_ 和 __foo__ 三者之间的区别是什么?__foo表示私有属性、_foo表示受保护的属性、__foo__表示Python自带的属性 2.请您简述Python编译的工作原理,PyCodeObject 和 Py...
    99+
    2023-01-31
    常见问题 基础 Python
  • python链接mysql常见问题汇总
    Python与Mysql一、安装MySQLdb模块使用python连接Mysql的前提,就是需要一个让python连接到Mysql的接口,这就是MySQLdb模块。验证是否已经安装了MySQLdb:=====================...
    99+
    2023-01-31
    常见问题 链接 python
  • Python常见面试问题有哪些
    这篇文章主要介绍“Python常见面试问题有哪些”,在日常操作中,相信很多人在Python常见面试问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python常见面试问题有哪些”的疑惑有所帮助!接下来...
    99+
    2023-06-04
  • Python工作中出现的几个常见问题
    这篇文章将为大家详细讲解有关Python工作中出现的几个常见问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题...
    99+
    2023-06-14
  • Python列表中最常见的问题有哪些
    这篇文章主要介绍“Python列表中最常见的问题有哪些”,在日常操作中,相信很多人在Python列表中最常见的问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python列表中最常见的问题有哪些”的疑...
    99+
    2023-06-02
  • OURS-S3C2410RP常见问题
    1. 配置Redhat分辨率 redhat-config-xfree86 2..挂载串口 vmware挂载USB转串口 /dev/ttyUSB0 3.往SMC卡烧写Linux系统时进入BusyBox无法ping通Redhat 首先配置网络...
    99+
    2023-01-31
    常见问题 S3C2410RP
  • Python常见的安全问题有哪些
    这篇文章给大家分享的是有关Python常见的安全问题有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、输入注入注入攻击非常广泛而且很常见,注入有很多种类,它们影响所有的语言、框架和环境。SQL 注入是直接编...
    99+
    2023-06-15
  • Flask框架使用异常捕获问题
    目录Flask框架使用异常捕获abort 方法errorhandler 装饰器开启调试模式Flask基础-->错误捕获(异常捕获)错误捕获(异常捕获)总结Flask框架使用异常...
    99+
    2022-12-20
    Flask框架 使用异常捕获 Flask异常捕获
  • Python中异常处理的常见问题及解决方法
    Python中异常处理的常见问题及解决方法引言:在编写程序时,很难避免出现各种各样的错误和异常。异常处理是一种机制,可以在程序运行时捕获和处理这些异常,从而保证程序的稳定性和可靠性。在Python中,异常处理是一项非常重要的技能,本文将介绍...
    99+
    2023-10-22
    异常处理 (Exception Handling) 解决方法 (Solutions) 常见问题 (Common Prob
  • hive中有哪些常见问题
    小编给大家分享一下hive中有哪些常见问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!hadoop 2.6.1hive 1.2.1或者hiv...
    99+
    2023-06-02
  • MySql中常见问题有哪些
    这篇文章将为大家详细讲解有关MySql中常见问题有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 1、默认编码集问题在做前台数据展示的时候...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作