搭建开发环境
1.1.1 pipenv python包管理工具 pip install pipenv
虚拟环境:通过创建虚拟环境,你可以拥有一个独立的Python解释器环
境。这样做的好处是可以为每一个项目创建独立的Python解释器环境,
因为不同的项目常常会依赖不同版本的库或Python版本。使用虚拟环境
可以保持全局Python解释器环境的干净,避免包和版本的混乱.
## hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello Flask!</h1>'
注册路由
route() 装饰器的第一个参数是url规则,用字符串标识,必须一斜杠开始
一个视图函数可以绑定多个URL
动态URL
@app.route('/greet<name>')
def greet(name):
return '<h1>hello, %s</h1>' % name
通过创建任意一个函数,并为其添加app.cli.command()装饰器,我们就可以注册一个flask命令
@app.cli.command()
def hello():
click.echo('Hello Human')
1.9 一个完整的网站,需要模板和静态文件来生成丰富的网页。模板即包含程序页面的html 文件,静态文件则是需要在HTML文件中加载的css和JavaScript文件,以及图片、字体文件等资源文件
模板文件存放在项目根目录中templates文件中,静态文件存放在static文件夹下,这两个文件夹需要和包含程序实例的模板处于同一个目录下
1.10 flask与mvc架构
在MVC架构中,程序被分为三个组件:数据处理model,用户界面view, 交互逻辑controller。
HTTP超文本传输协议:定义了服务器和客户端之间信息交流的格式和传递方式,他是万维网中数据交换的基础
RFC request for comment 请求评议 是一系列关于互联网标准和信息文件,可以将其理解为互联网的设计文档。
当一个用户访问一个URL,浏览器便生成对应的http请求,经由互联网发送到对应的维表服务器,web服务器接收请求,通过wsgi将http格式的请求数据转换成我们flask程序能够使用的python数据,在程序中,flask根据请求的URL执行对应的视图函数,获取返回值生成响应。响应依次经过wsgi转换生成http响应,再经由web服务器传递,最终被发出请求的客户端接收。浏览器渲染响应中包含的html和css代码,并执行JavaScript代码,最终把解析后的页面呈现在用户浏览器的窗口中。
请求报文:
浏览器与服务器之间交互的数据被称为报文
服务器返回的数据成为响应报文
URL处理:flask中url变量部分默认为string类型,但是flask提供一些转换器可以在url规则中使用
flask内置的url变量转换器
string int float path any uuid
@app.route('goback/<int:year>')
def go_back(year):
return '<p>Weclome to %d!</p>' %(201 - year)
在用法上唯一特别的是any转换器,需要在转换器后添加括号来给出可选值
@app.route('/colors/<any(bule, white, red): color>')
def three_colors(color):
return '...'
# 如果将<color>部分替换成any转换器设置之外的任意字符,会出现404错误响应
# 如果你想在any转换器中传入一个预先定义的列表,可以通过格式化字符串的方式来构建url规则字符串
colors = ['white','bule','red']
@app.route('/colors/<any(%s):color>' % str(colors)[1:-1])
2.2.4 请求钩子
有时需要对请求进行预处理和后处理,这时可以使用flask提供的一些请求钩子(Hook),他们可以用来注册在请求处理的不同阶段执行的处理函数(回调函数callback)
- before_first_request
- before_request
- after_request
- teardown_request
- after_this_request
重定向
使用flask提供的redirect() 函数来生成重定向响应,其状态码为302
from flask import Flask, redirect
# ...
@app.route('/hello')
def hello():
return redirect('http://www.wxample.com')
如果要在程序内重定向到其他视图,那么只需要在redirect()函数中使用url_for() 函数生成目标url即可
from flask import Flask, redirect, url_for
...
@app.route('/hi')
def hi():
...
return redierct(url_for('hello')) # 重定向到/hello
@app.route('/hello')
def hello():
...
2.错误响应
如果想手动返回错误响应,更方便的方法是使用flask提供的abort()函数
from flask import Flask,abort
...
@app.route('/404')
def not_found();
abort(404)
# abort()函数前不需要使用return语句,一旦abort()函数被调用,abort()函数之后的代码将不会被执行
使用cookie技术在存储客户端的用户信息
set_cookie视图来设置cookie,它会将url中name变量的值设置到名为name的cookie里
from flask import Flask,make_response
...
@app.route('/set/<name>'):
def set_cookie(name):
response = make_response(redirect(url_for('hello')))
response.set_cookie('name', name)
return response
模拟用户认证
使用session模拟用户的认证功能
from flask import redirect ,session, url_for
@app.route('/login')
def login():
session['logged_in'] = True
return redirect(url_for('hello'))
验证url安全性
from urlparse import urlparse, urljoin
from flask import request
def is_safe_url(target):
ref_url = urlparse(request.host_url)
test_url = urlpaese(urljoin(request.host_url, target))
return test_url.scheme in ('http','https') and ref_url.netloc == test_url.netloc