如何自定义响应头Flask中的响应类

以Flask为例讲解Python的框架的使用方法
作者:廖雪峰
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Python的框架的使用方法,文中以Flask框架的安装为例进行讲解,代码基于Python2.x版本,需要的朋友可以参考下
了解了WSGI框架,我们发现:其实一个Web App,就是写一个WSGI的处理函数,针对每个HTTP请求进行响应。
但是如何处理HTTP请求不是问题,问题是如何处理100个不同的URL。
每一个URL可以对应GET和POST请求,当然还有PUT、DELETE等请求,但是我们通常只考虑最常见的GET和POST请求。
一个最简单的想法是从environ变量里取出HTTP请求的信息,然后逐个判断:
def application(environ, start_response):
method = environ['REQUEST_METHOD']
path = environ['PATH_INFO']
if method=='GET' and path=='/':
return handle_home(environ, start_response)
if method=='POST' and path='/signin':
return handle_signin(environ, start_response)
只是这么写下去代码是肯定没法维护了。
代码这么写没法维护的原因是因为WSGI提供的接口虽然比HTTP接口高级了不少,但和Web App的处理逻辑比,还是比较低级,我们需要在WSGI接口之上能进一步抽象,让我们专注于用一个函数处理一个URL,至于URL到函数的映射,就交给Web框架来做。
由于用Python开发一个Web框架十分容易,所以Python有上百个开源的Web框架。这里我们先不讨论各种Web框架的优缺点,直接选择一个比较流行的Web框架——Flask来使用。
用Flask编写Web App比WSGI接口简单(这不是废话么,要是比WSGI还复杂,用框架干嘛?),我们先用easy_install或者pip安装Flask:
$ easy_install flask
然后写一个app.py,处理3个URL,分别是:
&&& GET /:首页,返回Home;
&&& GET /signin:登录页,显示登录表单;
&&& POST /signin:处理登录表单,显示登录结果。
注意噢,同一个URL/signin分别有GET和POST两种请求,映射到两个处理函数中。
Flask通过Python的装饰器在内部自动地把URL和函数给关联起来,所以,我们写出来的代码就像这样:
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
return '&h1&Home&/h1&'
@app.route('/signin', methods=['GET'])
def signin_form():
return '''&form action="/signin" method="post"&
&p&&input name="username"&&/p&
&p&&input name="password" type="password"&&/p&
&p&&button type="submit"&Sign In&/button&&/p&
&/form&'''
@app.route('/signin', methods=['POST'])
def signin():
# 需要从request对象读取表单内容:
if request.form['username']=='admin' and request.form['password']=='password':
return '&h3&Hello, admin!&/h3&'
return '&h3&Bad username or password.&/h3&'
if __name__ == '__main__':
运行python app.py,Flask自带的Server在端口5000上监听:
$ python app.py
* Running on http://127.0.0.1:5000/
打开浏览器,输入首页地址http://localhost:5000/:
首页显示正确!
再在浏览器地址栏输入http://localhost:5000/signin,会显示登录表单:
输入预设的用户名admin和口令password,登录成功:
输入其他错误的用户名和口令,登录失败:
实际的Web App应该拿到用户名和口令后,去数据库查询再比对,来判断用户是否能登录成功。
除了Flask,常见的Python Web框架还有:
&&&:全能型Web框架;
&&& :一个小巧的Web框架;
&&&:和Flask类似的Web框架;
&&& :Facebook的开源异步Web框架。
当然了,因为开发Python的Web框架也不是什么难事,我们后面也会自己开发一个Web框架。
有了Web框架,我们在编写Web应用时,注意力就从WSGI处理函数转移到URL+对应的处理函数,这样,编写Web App就更加简单了。
在编写URL处理函数时,除了配置URL外,从HTTP请求拿到用户数据也是非常重要的。Web框架都提供了自己的API来实现这些功能。Flask通过request.form['name']来获取表单的内容。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具1806人阅读
用flask开发个人博客(39)
&&&&&&& 在之前的代码中,视图函数都返回了一个字符串,在实际的开发中其返回的html文件内容,本质其实也是字符串。下面总结下flask中可以作为响应的几种方法。
1、响应字符串。
&&&&&&& 这个在前面已经说明过,但是需要指出的是,其实每次视图函数在响应时还可以附带状态码。比如状态码为200,表示请求已经被成功处理。状态码为400,表示请求无效。
@app.route('/')
def index():
return 'bad request',400
2、响应Response对象
&&&&&&& 利用make_reponse()函数接受字符串和错误码,返回一个Response对象,利用这种方法,不但可以成功处理请求,还可以进一步设置响应,如设置cookie等等:
from flask import make_response
@app.route('/')
def index():
response=make_response('set cookies!')
response.set_cookie('hyman','123')
return response
3、返回重定向类型redirect
重定向类型指输入一个URL后,自动跳转到另一个URL所在的地址
from flask import redirect
@app.route('/')
def index():
return redirect('')
在浏览器中输入‘localhost:5000’之后,直接跳转到百度界面
4、返回处理错误码
利用abort返回处理错误
from flask import abort
@app.route('/')
def index():
abort(404)
克隆本项目:
it&:HymanLiuTS/flaskTs.git
获取本文源代码:
git checkout FL05
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:400528次
积分:6795
积分:6795
排名:第3796名
原创:293篇
转载:17篇
评论:65条
我的Github:
我的个人网站:
我的个人邮箱:
文章:43篇
阅读:26043
文章:40篇
阅读:84204
文章:18篇
阅读:21769
文章:58篇
阅读:75477
文章:21篇
阅读:32696
文章:13篇
阅读:14290
(1)(2)(1)(1)(3)(22)(7)(31)(48)(32)(34)(31)(9)(12)(8)(6)(7)(7)(7)(8)(10)(11)(4)(2)(7)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'python入门教程之Flask 框架快速入门
python入门教程之Flask 框架快速入门
python热爱者
Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,大部分代码引用自官方文档。安装Flask 首先我们来安装Flask。最简单的办法就是使用pip。 pip install flask然后打开一个Python文件,输入下面的内容并运行该文件。然后访问localhost:5000,我们应当可以看到浏览器上输出了Hello Flask!。
我们修改代码中的输出,然后查看浏览器上是否有变化。如果你照做的话,可以看到什么变化都没有。其实Flask内置了调试模式,可以自动重载代码并显示调试信息。这需要我们开启调试模式,方法很简单,设置FLASK_DEBUG环境变量,并将值设置为1。然后再次运行程序,会看到有这样的输出。这时候如果再次修改代码,会发现这次Flask会自动重启。
路由在上面的例子里可以看到路由的使用。如果了解Spring Web MVC的话,应该对路由很熟悉。路由通过使用Flask的app.route装饰器来设置,这类似Java的注解。@app.route('/')def index(): return 'Index Page'@app.route('/hello')def hello(): return 'Hello, World' 路径变量如果希望获取/article/1这样的路径参数,就需要使用路径变量。路径变量的语法是/path/。在路径变量前还可以使用可选的转换器,有以下几种转换器。下面是Flask官方的例子。
构造URL在Web程序中常常需要获取某个页面的URL,在Flask中需要使用url_for('方法名')来构造对应方法的URL。下面是Flask官方的例子。
HTTP方法如果需要处理具体的HTTP方法,在Flask中也很容易,使用route装饰器的methods参数设置即可。
静态文件.Web程序中常常需要处理静态文件,在Flask中需要使用url_for函数并指定static端点名和文件名。在下面的例子中,实际的文件应放在static/文件夹下。url_for('static', filename='style.css') 模板生成
Flask默认使用Jinja2作为模板,Flask会自动配置Jinja 模板,所以我们不需要其他配置了。默认情况下,模板文件需要放在templates文件夹下。使用 Jinja 模板,只需要使用render_template函数并传入模板文件名和参数名即可。 相应的模板文件如下。
Flask 为我们预配置了一个 Logger,我们可以直接在程序中使用。这个Logger是一个标准的Python Logger,所以我们可以向标准Logger那样配置它,详情可以参考官方文档或者我的文章Python 日志输出。
在 Flask 中获取请求参数需要使用request等几个全局对象,但是这几个全局对象比较特殊,它们是 Context Locals ,其实就是 Web 上下文中局部变量的代理。虽然我们在程序中使用的是全局变量,但是对于每个请求作用域,它们都是互不相同的变量。理解了这一点,后面就非常简单了。Request 对象Request 对象是一个全局对象,利用它的属性和方法,我们可以方便的获取从页面传递过来的参数。method属性会返回HTTP方法的类似,例如post和get。form属性是一个字典,如果数据是POST类型的表单,就可以从form属性中获取。下面是 Flask 官方的例子,演示了 Request 对象的method和form属性。 如果数据是由GET方法传送过来的,可以使用args属性获取,这个属性也是一个字典。searchword = request.args.get('key', '') 文件上传
利用Flask也可以方便的获取表单中上传的文件,只需要利用 request 的files属性即可,这也是一个字典,包含了被上传的文件。如果想获取上传的文件名,可以使用filename属性,不过需要注意这个属性可以被客户端更改,所以并不可靠。更好的办法是利用werkzeug提供的secure_filename方法来获取安全的文件名。
Flask也可以方便的处理Cookie。使用方法很简单,直接看官方的例子就行了。下面的例子是如何获取cookie。 如果需要发送cookie给客户端,参考下面的例子。
重定向和错误
redirect和abort函数用于重定向和返回错误页面。 默认的错误页面是一个空页面,如果需要自定义错误页面,可以使用errorhandler装饰器。
默认情况下,Flask会根据函数的返回值自动决定如何处理响应:如果返回值是响应对象,则直接传递给客户端;如果返回值是字符串,那么就会将字符串转换为合适的响应对象。我们也可以自己决定如何设置响应对象,方法也很简单,使用make_response函数即可。
我们可以使用全局对象session来管理用户会话。Sesison 是建立在 Cookie 技术上的,不过在 Flask 中,我们还可以为 Session 指定密钥,这样存储在 Cookie 中的信息就会被加密,从而更加安全。直接看 Flask 官方的例子吧。
这里简单的介绍一下Jinja 模板的使用方法,详细资料直接看原文档吧。 模板标签其实Jinja 模板和其他语言和框架的模板类似,反正都是通过某种语法将HTML文件中的特定元素替换为实际的值。如果使用过JSP、Thymeleaf 等模板,应该可以非常容易的学会使用 Jinja模板。其实从上面的例子中我们应该可以看到Jinja 模板的基本语法了。代码块需要包含在{% %}块中,例如下面的代码。 双大括号中的内容不会被转义,所有内容都会原样输出,它常常和其他辅助函数一起使用。下面是一个例子&a class=&navbar-brand& href={{ url_for('index') }}&Flask小例子&/a&
继承 模板可以继承其他模板,我们可以将布局设置为父模板,让其他模板继承,这样可以非常方便的控制整个程序的外观。例如这里有一个layout.html模板,它是整个程序的布局文件。 其他模板可以这么写。对比一下面向对象编程的继承概念,我们可以很容易的理解。
条件判断可以这么写,类似于JSP标签中的Java 代码,{% %}中也可以写Python代码。下面是Flask官方文档的例子。 循环的话可以这么写,和在Python中遍历差不多。 需要注意不是所有的Python代码都可以写在模板里,如果希望从模板中引用其他文件的函数,需要显式将函数注册到模板中。可以参考这个爆栈提问。写在最后这篇文章主要参考了Flask的官方文档,但是只介绍了 Flask的最基本的一部分。了解了这部分,我们可以用Python 搭一个小服务器做点事情。如果希望详细了解 Flask的使用用法,请关注更详细的资料。本文就是起一个抛砖引玉的效果。顺便说,通过Flask 我也了解了Python 语言的执行速度。我们都知道编译器编译出来的代码执行起来要比解释器解释代码要快大约几十倍到几千倍不等。以前学Java的时候,感觉Java 慢,主要原因就是等待编译时间比较长。相对来说用Python写脚本就很块了,因为没有编译过程。但是从Flask的运行速度来看,我切身感受到了Python 执行确实不快。举个例子,在Spring中写一个控制器,接受HTTP参数,并显示到页面上,如果程序编译完之后,这个显示过程基本是瞬时的。但是同样的需求在Flask中,我居然可以感觉到明显的延迟(大概几百毫秒的等待时间)。
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
python热爱者
百家号 最近更新:
简介: python学习资料不定期更新
作者最新文章

我要回帖

更多关于 c 中的自定义类型 的文章

 

随机推荐