Python 框架之Flask初步了解
前言
在了解python web 框架之前,我们需要先了解框架实现的基本原理。首先,需要了解WSGI(Web Server Gateway Interface),借助WSGI我们就能实现用Python专注于生成HTML文档,不用接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。
WSGI将Web服务分成两个部分:服务器和应用程序。WGSI服务器只负责与网络相关的两件事:接收浏览器的HTTP请求、向浏览器发送HTTP应答;而对HTTP请求的具体处理逻辑,则通过调用WSGI应用程序进行。
Flask
Flask与别的框架(尤其是采用其他编程语言的框架)的不同之处在于:它没有绑定诸如数据库查询或者表单处理等功能库,以及它们所组成的整个生态系统。它倾向于对这些功能的实现方式不做任何限定。
实验环境:win10、pycharm、anaconda2.4
安装:
由于安装了anaconda全家桶,所以已经自动包含了flask的框架。需要安装的话可以通过pip命令进行安装。
试运行hello world
在pycharm新建一个项目,配置相关python解释器,然后创建hello.py文件,写入如下代码:
from flask import Flaskapp = Flask(__name__)@app.route('/') def hello_world():return 'Hello world!' @app.route('/test') def test():return 'This is a test'if __name__ == '__main__':app.run()
点击run的按钮,即可在浏览器输入127.0.0.1:5000,显示如下:
关于路由分发
通过@app.route(‘xxx’)形式分配路由,如上代码,“/”表示访问站点根目录,即hello_world()函数,“/test”表示访问test()函数,通过这种新式我们可以很方便的给路由进行分组。
关于变量规则
如果希望获取
/hello/1
这样的路径参数,就需要使用变量规则。语法是/path/<converter:varname>
。在变量前还可以使用可选的转换器,有以下几种转换器:
转换器 | 作用 |
---|---|
string | 默认选项,接受除了斜杠之外的字符串 |
int | 接受整数 |
float | 接受浮点数 |
path | 和string类似,不过可以接受带斜杠的字符串 |
any | 匹配任何一种转换器 |
uuid | 接受UUID字符串 |
构建url
使用函数
url_for()
来针对一个特定的函数构建一个 URL。它能够接受函数名作为第一参数,以及一些关键字参数, 每一个关键字参数对应于 URL 规则的变量部分。未知变量部分被插入到 URL 中作为查询参数。如:
from flask import Flask, url_for app = Flask(__name__) @app.route('/') def index():return 'Home page'@app.route('/login') def login():return 'Get login'@app.route('/user/<username>') def profile(username):return 'show user %s' % usernamewith app.test_request_context():print url_for('index')print url_for('login')print url_for('profile', username='John Doe')if __name__ == '__main__':app.run()
HTTP方法
首先需要引入request的包,route装饰器中会有相应的methods参数
from flask import request@app.route('/login', methods=['GET', 'POST']) def login():if request.method == 'POST':do_the_login()else:show_the_login_form()
静态文件的引入
静态文件如css、js资源的引入需要在项目中创建static文件夹,用/static来引用访问。也可以给资源定义url
url_for('static', filename='common.css')
模板渲染
引入render_template,模板文件需要放在templates 文件夹中,通过render_template()渲染模板。
from flask import render_template@app.route('/hello/') @app.route('/hello/<name>') def hello(name=“”):return render_template('hello.html', name=name)
模板继承
设置可重写区域:
# 以 {% block xx %} 开头# 以 {% endblock %} 结束
继承:
# 以 {% extends "base.html" %} 可继承base.html# 以 {{ super() }} 可获取父类内容
request 对象
request 是一个全局对象。可通过request对象获取页面的传输数据。当前请求的方法可以用
method
属性来访问。你可以用form
属性来访问表单数据,如:@app.route('/login', methods=['POST', 'GET']) def login():error = Noneif request.method == 'POST':if valid_login(request.form['username'],request.form['password']):return log_the_user_in(request.form['username'])else:error = 'Invalid username/password'return render_template('login.html', error=error)
cookies
from flask import request# cookies 的读取# 使用 cookies.get(key) 代替 cookies[key] 避免# 得到 KeyError 如果cookie不存在@app.route('/get') def index():username = request.cookies.get('username')# cookies 的发送@app.route('/set') def index1():resp = make_response(render_template(...))resp.set_cookie('username', 'the username')return resp
重定向和错误
重定向采用
redirect()
函数,错误中断采用abort()
函数并指定一个错误代码(如404),通过errorhandler()
装饰器制定自定义错误页面。如:from flask import abort, redirect, url_for@app.route('/') def index():return redirect(url_for('login'))@app.route('/login') def login():abort(404)this_is_never_executed()
错误界面:
from flask import render_template@app.errorhandler(404) def page_not_found(error):return render_template('page_not_found.html'), 404
session 会话
from flask import Flask, session, redirect, url_for, escape, requestapp = Flask(__name__)@app.route('/') def index():if 'username' in session:return 'Logged in as %s' % escape(session['username'])return 'You are not logged in'@app.route('/login', methods=['GET', 'POST']) def login():if request.method == 'POST':session['username'] = request.form['username']return redirect(url_for('index'))return '''<form action="" method="post"><p><input type=text name=username><p><input type=submit value=Login></form>'''@app.route('/logout') def logout():# remove the username from the session if it's theresession.pop('username', None)return redirect(url_for('index'))# set the secret key. keep this really secret:app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
- 生成随机密钥:
附上一些有用的说明,便于理解: urandom
import os os.urandom(24)
日志
flask提供Logger,Logger是一个标准的Python Logger,所以我们可以向标准Logger那样配置它,详情查阅官方文档 logging documentation。
app.logger.debug('A value for debugging') app.logger.warning('A warning occurred (%d apples)', 42) app.logger.error('An error occurred')