flask post请求浏览器请求一个方法后怎么打印元组

没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Flask Web Development && 基本应用程序结构(下)
摘要:5、请求-响应循环现在你已经玩过一个基本的Flask应用程序,你也许想要知道更多关于Flask如何施展魔力。下面章节描述了一些框架设计方面的特点。5.1、应用程序Context和请求Context当Flask从客户端收到一个请求,它需要提供几个可用对象给视图函数处理。request对象是个不错的例子,它封装了客户端发送的HTTP请求。Flask视图函数访问request对象的最好方式,就是作为一个参数发送它,但这需要每个单一视图函数在应用程序中有一个额外的参数。考虑一下,如果
5、请求-响应循环
现在你已经玩过一个基本的Flask应用程序,你也许想要知道更多关于Flask如何施展魔力。下面章节描述了一些框架设计方面的特点。
5.1、应用程序Context和请求Context
当Flask从客户端收到一个请求,它需要提供几个可用对象给视图函数处理。 request对象 是个不错的例子,它封装了客户端发送的HTTP请求。
Flask视图函数访问request对象的最好方式,就是作为一个参数发送它,但这需要每个单一视图函数在应用程序中有一个额外的参数。考虑一下,如果request对象不是唯一一个视图函数需要访问完成请求的对象,事情将会变得更加复杂。
为了避免弄乱视图函数那些可能需要或不需要的参数,Flask使用 context 来临时确定可访问的全局对象。也多亏了context,视图函数可以写成下面这样:
from flask import ('/')def index(): user_agent = request.headers.get('User-Agent') return 'Your browser is %s' % user_agent
注意,在这个视图函数中,request是如何被作为一个全局变量来使用的。现实中,request是不能作为全局变量的,如果是多线程服务器,同一时间线程作用于不同客户端的不同请求,所以每一个线程需要看到request中的不同对象。contexts使得Flask确定可访问的全局变量而不干扰其他线程。
注:线程是可以独立管理的最小指令序列。一个进程中有多个活动的线程是非常常见的,有时分享内存或文件句柄资源。多线程web服务器会启动一个线程池并从池中选择一个线程来处理每个传入的请求。
Flask有两类context: 应用级context 和 请求级context 。表2-1展示了这些context提供的变量。
表2-1. Flask全局context
Flask激活(或压栈)应用级context和请求级context在调度请求之前,然后删除他们当请求被处理后。当应用程序context被压入栈,线程中 current_app 和 g 变量变得可用;同样的,当请求级context被压入栈, request 和 session 变量也同样变得可用。如果这些变量中的任何一个不是由激活的应用级或请求级context访问,会产生错误。在后面的章节会详细讨论四个context变量,所以不要担心你不理解它们的用处。
下面的Python shell会话演示了应用级context是如何工作的:
&&& from hello import app&&& from flask import current_app&&& current_app.nameTraceback (most recent call last):...RuntimeError: working outside of the application context&&& app_ctx = app.app_context()&&& app_ctx.push()&&& current_app.name'hello'&&& app_ctx.pop()
在这个示例中,当应用级context没有激活,但是却作为有效的context被压入栈中, current_app.name 报错。注意在应用程序实例中一个应用级context是如何通过调用 app.app_context() 来获得的。
5.2、请求调度
当一个应用程序收到客户端的请求,它需要找到响应的视图函数为之服务。对于这个任务,Flask会在应用程序的 URL映射 中查找请求的URL,该映射包含URLs和操作它们的视图函数。Flask通过 app.route 装饰器或非装饰器版本 app.add_url_rule() 来建立这个映射。
看一下Flask应用程序中URL映射是怎样的,你可以在Python shell中检查 hello.py 创建的映射。测试中,请确保你的虚拟环境是激活状态:
(venv) % python&&& from hello import app&&& app.url_mapMap([&Rule '/' (HEAD, OPTIONS, GET) -& index&,&Rule '/static/&filename&' (HEAD, OPTIONS, GET) -& static&,&Rule '/user/&name&' (HEAD, OPTIONS, GET) -& user&])
/ 和 /user/&name& 路由是由应用程序中的 app.route 所定义。 /static/&filename& 路由是由Flask添加,用于访问静态文件的一个特殊路由。你将在第三章学习更多关于静态文件的内容。
URL映射中所示的 HEAD 、 OPTIONS 、 GET 元素为 request方法 ,由路由处理。Flask连接方法到每个路由,这样不同的请求方法发送到相同的URL可以被不同的视图函数处理。 HEAD 和 OPTIONS 方法由Flask自动管理,所以实际上可以说,在这个应用程序中URL映射的三个路由都连接到 GET 方法了。在第四章你将学习为路由指定不同的请求方法。
5.3、请求Hooks
有些时候在每个请求处理之前或之后执行代码是非常有用的。例如,在开始每一个请求前可能有必要创建数据库连接,或对用户请求进行验证。为了避免复制处理这些操作的代码到每一个视图函数中,Flask给你选择注册相同函数来调用,在请求被分配给视图函数之前或之后。
请求hooks由装饰器实现。下面是四个Flask支持的hooks:
before_first_request :在第一个请求被处理前注册一个函数运行。
before_request :在每一个请求前注册一个函数运行。
after_request :如果没有未处理的异常发生,在每一个请求后注册一个函数运行。
teardown_request :即使未处理的异常发生,在每一个请求后注册一个函数运行。
在请求hook函数和视图函数之间共享数据的惯用方法就是使用 g 全局context。例如, before_request 处理程序可以从数据库加载已登录的用户并保存在 g.user 中。之后,当视图函数被调用,可以从那访问用户。
请求hooks的示例会在未来的章节中展示给大家,所以不用担心,
当Flask调用一个视图函数,并期望它的返回值去响应该请求。大多数的响应是将简单字符串构成的HTML页面发回给客户端。
但是HTTP协议需要比字符串更多的信息作为请求的响应。一个HTTP响应中非常重要的部分是 状态码 ,Flask默认设置200来指示请求已经成功处理。
当视图函数需要用不同的状态码响应,可以在响应文本后添加数字码作为第二个返回值。例如,下面的视图函数返回400错误状态码的请求:
@app.route('/')def index():return '&h1&Bad Request&/h1&', 400
视图函数返回的响应还可以携带第三个参数,添加一个头部字典给HTTP响应。通常很少用到,但是你可以在第十四章看到示例。
除了返回一个、两个或三个值的元组,Flask视图函数可以选择返回 response对象 。 make_response() 函数可携带一个、两个或三个参数,和视图函数返回的值一样,并返回一个response对象。有时候在视图函数中执行这个转换是非常有用的,然后使用response对象中的方法进一步配置响应。下面的示例创建response对象并设置cookie:
from flask import ('/')def index(): response = make_response('&h1&This document carries a cookie!&/h1&') response.set_cookie('answer', '42') return response
有一类特殊的响应称作 重定向 。这类响应不包含页面文档;只是给浏览器一个新的URL去加载新的页面。重定向通常和web表单一起使用,你将在第四章学习。
重定向通常由302响应状态码注明并且重定向的URL由头部的 Location 给出。重定向响应可以使用三个值的返回生成,也可通过响应对象生成,但是鉴于它频繁的使用,Flask提供 redirect() 函数来创建这样的响应:
from flask import ('/')def index():return redirect('http://www.example.com')
另一个具有中断功能的特殊响应用来错误处理。下面的示例,当URL给出的id动态参数不是一个合法的用户时返回状态码404:
from flask import ('/user/&id&')def get_user(id): user = load_user(id) if not user:
abort(404) return '&h1&Hello, %s&/h1&' % user.name
注意终止不是指将控制权返回给调用它的函数,而是指通过抛出异常将控制权返回给web服务。
6、Flask扩展
Flask是可扩展的。它故意腾出地给重要的功能,例如数据库和用户授权,给你自由去选择最适合你的应用程序的包,或写一个自己想要的。
社区开发了非常多的 扩展 用于各种用途,如果这还不够,可以使用任何Python标准包和库。为了让你了解一个扩展是如何并入一个应用程序的,下面的章节给hello.py添加一个扩展,增加应用程序的命令行参数。
6.1、Flask-Script命令行选项
Flask开发,其web服务器支持一系列的启动配置选项,但是配置它们的唯一方式只有在脚本中传递参数给 app.run() 并调用。这不是非常的方便,理想方法是通过命令行参数传递配置选项。
Flask-Script是给你的Flask应用程序添加命令行解释的扩展。它打包了一组通用的选项,还支持自定义命令。
使用pip安装扩展:
(venv) $ pip install flask-script
示例2-3展示了在 hello.py 应用程序中添加命令行解释的变化。
示例2-3. hello.py:使用Flask-Script
from flask.ext.script import Managermanager = Manager(app)# ...if __name__ == '__main__':manager.run()
专为Flask开发的扩展暴露在 flask.ext 命名空间下。Flask-Script从 flask.ext.script 中导出一个名为 Manager 的类。
初始化这个扩展的方法和其他许多扩展一样:主类实例的初始化是通过将应用程序实例作为参数传递给构造函数实现的。创建的对象适当的用于每一个扩展。在这个示例中,服务器启动通过 manager.run() 来路由,且命令行在这被解析。
建议:如果你有克隆在GitHub上的应用程序,你现在可以运行 git checkout 2c 来切换到这个版本的应用程序。
因为这些变化,应用程序获得一组基本的命令行选项。运行 hello.py 显示可用信息:
$ python hello.pyusage: hello.py [-h] {shell, runserver} ...positional arguments:{shell, runserver}shell 在Flask应用程序上下文的内部运行一个Python Shell。runserver 运行Flask开发服务器,例如:app.run()optional arguments:-h, --help显示这个帮助信息并退出
shell 命令用于在应用程序上下文中启动一个Python shell会话。你可以使用这个会话去运行维护任务,或测试,或调试错误。
runserver 命令,就像它的名称一样,启动web服务。运行 python hello.py runserver 在调试模式下启动web服务,还有更多的选项:
(venv) $ python hello.py runserver --helpusage: hello.py runserver [-h] [-t HOST] [-p PORT] [--threaded][--processes PROCESSES] [--passthrough-errors] [-d][-r]运行Flask开发服务器,例如:app.run()optional arguments:-h, --help 显示这个帮助信息并退出-t HOST, --host HOST-p PORT, --port PORT--threaded--processes PROCESSES--passthrough-errors-d, --no-debug-r, --no-reload
--host 参数是一个非常有用的选项,因为它能告诉web服务器监听哪个网络接口的客户端连接。默认,Flask开发的web服务器监听 localhost 的连接,所以只有来自内部计算机运行的服务器可以接收。下面的命令使得web服务器监听公网接口,其他网络上的计算机可以连接:
(venv) $ python hello.py runserver --host 0.0.0.0 * Running on http://0.0.0.0:5000/ * Restarting with reload
现在web服务器应该可以从网络中的任何一台计算机访问
http://a.b.c.d:5000
,“a.b.c.d”是运行服务的计算机的外部IP地址。
这一章介绍了请求响应的概念,但说的更多的是响应。Flask使用 模板 为生成响应提供非常好的支持,这是非常重要的话题,下一章会重点讲它。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Flask Web Development && 基本应用程序结构(下)相关信息,包括
的信息,所有Flask Web Development && 基本应用程序结构(下)相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
Internationalflask一、路由,请求,响应,重定向 - 简书
flask一、路由,请求,响应,重定向
Flask基础Part1
Flask是一个Python实现的Web开发微框架。他与Django不同,Django是大而全面,而Flask是短小精悍。Django就好比买电脑时的一台整机,而Flask更像是一个可以自己DIY的组装机,可以跟具自己项目的需求对框架进行附加额外的模块。
在Flask中的路由非常的简单,只需要把一个函数绑定到route()装饰器上,并将URL传递进去。
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello world'
路由中的变量规则
有时候需要接收URL中的参数变量,可以把参数标记为一个变量&变量名&,这个部分将会作为命名参数传递给函数。同时还可以限制参数变量的类型&类型:变量名&。
@app.route('/user/&username&')
def show_user_info(username):
# 进行数据查询的代码
return 'User %s' % username
@app.route('/post/&int:aritle_id&')
def show_article(aritle_id):
# 进行数据查询的代码
return 'Aritle ID : %s' % aritle_id
数据类型一共有三种:int, float, path
同 int ,但是接受浮点数
和默认的相似,但也接受斜线
路由一定要写规范,不规范的URL路由会导致额外的404错误。
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
当访问projects时,使用规范的URL地址http://127.0.0.1/projects/能够正常的访问,而使用http://127.0.0.1/projects时Flask会自动的重定向到规范的URL地址。
当访问about时,使用不规范的URL地址http://127.0.0.1/about能正常访问,但是当使用规范的URL地址http://127.0.0.1/about/进行访问时就会报404错误。
既然Flask能匹配URL自然也能够生成对应的URL。这需要使用到url_for()方法。
from Flask import Falsk, url_for
app = Flask(__name__)
@app.route('/')
def index():
print(url_for('index'))
print(url_for('do_login', name='TengTengCai'))
print(url_for('get_user', user_id='1234'))
print(url_for('get_grade', grade_id='0987'))
return 'Index Page'
@app.route('/login/')
def do_login():
return 'Login Method'
@app.route('/user/&user_id&/')
def get_user(user_id):
return 'User ID is %s' % str(user_id)
@app.route('/grade/&int:grade_id&/')
def get_grade(grade_id):
return 'Grade ID is %s type is %s' % (str(grade_id), type(grade_id))
通过python app.py启动服务器,通过访问根路径查看输出结果。
/login/?name=TengTengCai
/user/1234/
/grade/0987/
Flask和Django一样都配备了Jinja2模版引擎,可以使用render_template()方法来渲染模版。
├─static
└─templates
index.html
from flask import render_template, Flask, Manager
app = Flask(__name__)
manager = Manager(app)
@app.route('/index/')
@app.route('/index/&name&/')
def index(name=''):
return render_template('index.html',name=name )
if __name__ == '__main__':
manager.run()
index.html模版文件, 使用jinja2模版渲染,将名字显示在模版html文件中,加载静态文件。
模版文件(templates)和静态文件(statics)的目录访问,默认于app.py属于同级目录,如果目录地址发生改变,需要进行设置。(设置路径会在后面的蓝图(blueprints)讲到)
&!DOCTYPE html&
&html lang="en"&
&meta charset="UTF-8"&
&title&Index&/title&
&link type="text/css" rel="stylesheet" href="/static/css/style.css"&
&h1&欢迎用户 {{ name }}&/h1&
style.css文件
margin: 0;
padding: 0;
启动服务,访问http://127.0.0.1:5000/index/TengTengCai/
访问index页面
请求(request)
request请求,在使用请求之前需要从Flask中导入它。
from flask import request
当前请求的HTTP方法可以通过method属性来获取。
GET方法中的参数可以通过request.args.get(key, default)来获取
POST方法中的参数可以通过request.form.get(key, default)来获取
如果请求中存在文件则可以通过files属性来获取Python中的file对象
@app.route('/UserInfo/', methods=['POST', 'GET'])
def get_user():
if request.method == 'GET':
args = request.args
name = args.get('name', '')
# 如果name参数只有一个可使用get
names = args.getlist('name')
# 如果name参数有多个可使用getlist,返回一个list
elif rqeuest.method == 'POST':
name = request.form.get('name')
# 如果name参数表单中只有一个可使用get
names = request.form.getlist('name')
# 如果name参数表单中有多个可使用getlist,返回一个list
my_files = request.files['my_file']
my_files.save('filename')
# 存储的文件路径和名称
return 'error'
return 'Name is %s, Names is %s' % (name, str(names))
响应(response)
视图函数的返回值会被自动转换为一个响应对象。如果返回值是一个字符串,它会被转换为该字符串为主体的、状态码为200 OK的MIME类型是test/html的响应对象。
Flask把返回值转换为响应对象的过程:
如果返回的是一个正确的响应对象,它会从视图直接返回。
如果返回的是一个字符串,响应对象会用字符串数据和默认参数创建。
如果返回的是一个元组,且元组中的元素可以提供额外的信息。这样的元组必须是(response, status, headers)的形式, 且至少包含一个元素。status值会覆盖状态代码,headers可以是一个列表或字典,作为额外的消息标头值。
如果上述条件均不满足,Flask会假设返回值是一个合法的WSGI应用程序,并转化为一个请求对象。(所以经常会看到关于WSGI的代码报错,实则是response响应出错了)
在视图中可以使用make_response()函数。使用前需要导入对应模块
from flask import make_response
@app.route(/myResponse/)
def get_response():
resp = make_response(render_template('test.html'), 200)
# 生成一个新的response对象
return resp
# 返回response对象
重定向和错误(redirect,error)
我们可以使用redirect()函数把用户重定向到其他地方。放弃请求并返回错误代码,用abort()函数。
from flask import abort, redirect, url_for, render_template
@app.route('/')
# 主页的路由
def index():
return redirect(url_for('login'))
# 重定向到login方法
@app.route('/login/')
# login的路由
def login():
abort(404)
# 抛出错误,终止运行
return 'error'
@app.errorhandler(404)
# 获取到404错误
def page_not_found(error):
return render_template('page_not_found.html'), 404
# 返回404页面,状态码为404
默认情况下,错误代码会显示一个黑白的错误页面,如果要定制,则可以使用errorhandler()装饰器
py界的一颗小星星
本来做了个目录快速跳转的,后来简书不再支持这种写法,无奈阅读只能自己根据章节明ctrl+f/v/enter来定位了 ┑( ̄Д  ̄)┍ --------------------------目录结构----------------------- 前言 Flask框架的特点 本书...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
pdf下载地址:Java面试宝典 第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 1. 面向对象都有哪些特性以及你对这些特性的理解 21 2. 访问权限修饰符public、private、protected, 以及不写(默认)时的区别(201...
快速启动 是不是很渴望马上开始啊?这篇文档将会很好的向你介绍Flask。假设你已经安装好了Flask。如果还没有安装的话,请查看Installation部分。 一个小型的应用 一个很小型的Flask应用是像下面这样的: 上面的代码做了什么呢? 以 hello.py 保存这个...
[TOC]一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见。最近正好时间充裕,决定试试做一下,并记录一下学习心得。首先说明一下,本文研究的Flask版本是0.12。首先做个小示例,在pycharm新建flask项目&flask_source&后,默认创建项目入口&...
一。 在考试面试的前一天,我终于下定决心,选择放弃了。 朋友说,太突然了;舍友也说,太可惜了,说不定刚好运气好,抽中的正是自己背得那一篇。 其实,一点也不突然,因为这个念头在10月份的时候就已经出现了,当时就已经有不想考试的念头。 只是我一直压抑着这个想法,硬着头皮做着自己...
Y姑娘认识L先生是在Y姑娘朋友的生日聚会上,L先生是D先生的同班同学,平常关系很好,所以这次聚会就带着L先生一起来了,L先生一米八的大高个,长得白白净净的,阳光又帅气,完完全全和Y姑娘的朋友不同,Y姑娘带着框镜坐在椅子上,偶尔喝一口杯子中的酒,听着朋友们的闲谈,和Y姑娘...
你们都以为我是快乐的小可爱?谁知道我身上背负着多少…
在我们千贝穿搭群里,Evelyn同学提出来一个问题,说想了解一下关于日系穿搭方面的一些知识,我们发现除了Evelyn以外,还有很多同学对此也很感兴趣,所以这次就专门写了这篇文章来分享给大家。当然如果你也有关于穿搭方面的一些疑问,你可以添加我们的学习委员千贝贝同学,把你的疑问...
27日,中央美术学院学生发博称,自己的iPad pro 在校丢失,查找监控后发现被同校一女生拿走。博主在老师帮助下拿回电脑,却发现电脑已被刷机, 自己多年的作品集都被清空。事后,偷拿博主电脑的同学联系到博主,称刷机为自己的弟弟所为,希望博主不要追究责任,不然自己会受到学校处...Flask 教程,第十部分:全文搜索 - 技术翻译 - 开源中国社区
Flask 教程,第十部分:全文搜索
【已翻译100%】
英文原文:
推荐于 5年前 (共 15 段, 翻译完成于 01-23)
参与翻译&(2人)&: ,
搜索显示方法(search view funciton)
上面我们已经设置了form的action字段,它会发送所有的搜索请求到search view方法。这就是我们要执行全文检索查询的地方(fileapp/views.py):
@app.route('/search', methods = ['POST'])
@login_required
def search():
if not g.search_form.validate_on_submit():
return redirect(url_for('index'))
return redirect(url_for('search_results', query = g.search_form.search.data))
这个方法干的事也不是很多,它只是从表单收集了搜索查询的字段,然后把这些字段作为参数传给查询方法,最后重定向到另一个页面。不在这儿直接做查询的原因是如果一个用户点击了刷新按钮,那么浏览器就会弹出“表单数据将被重新提交”的警告窗口。所以当一个POST请求的响应结果为重定向的时候,这种警告提示就被避免了,因为重定向之后浏览器的刷新按钮将会在重定向的页面被重新载入。
&翻译得不错哦!
搜索结果页面
一旦一个查询字段被接受,form POST handler就会通过页面重定向把它发送到search_result handler(fileapp/views.py):
@app.route('/search_results/&query&')
@login_required
def search_results(query):
results = Post.query.whoosh_search(query, MAX_SEARCH_RESULTS).all()
return render_template('search_results.html',
query = query,
results = results)
然后搜索结果显示方法会发送这个查询到Whoosh,参数是最大的搜索结果数目,因为我们不想呈现一个很大数目的结果页面,所以我们只显示前50条数据。
&翻译得不错哦!
最后一部分需要完成的是搜索结果的模板(fileapp/templates/search_results.html):
&!-- extend base layout --&
{% extends "base.html" %}
{% block content %}
&h1&Search results for "{{query}}":&/h1&
{% for post in results %}
{% include 'post.html' %}
{% endfor %}
{% endblock %}
这儿,我们又可以重新使用我们的post.html页面,所以我们不用担心替换一个新的页面或者其他格式的页面元素,因为所有这些在sub-template中都是通用的方法。
&翻译得不错哦!
我们现在就有了一个完整的、非常重要的、也是经常被忽视的功能,这也是任何一个优秀的web应用必须具备的功能。
这个时刻更新的微博客应用(换气中···)的源码你可以从这里找到:
&翻译得不错哦!
一如既往的,上面的下载不包括数据库和flask的虚拟环境。要创建这些你就看这个系列之前的文章吧。
我希望你喜欢这个教程。如果你又任何问题或者感想就写在下面的评论里。感谢你的阅读,我很希望在下一部分中看到你~
&翻译得不错哦!
我们的翻译工作遵照 ,如果我们的工作有侵犯到您的权益,请及时联系我们Flask入门系列(四)–请求,响应及会话 – 思诚之道

我要回帖

更多关于 谷歌浏览器 flask开启 的文章

 

随机推荐