flask开发笔记
最近接手了一个flask轻型框架,之前接触过一点点flask也只是为了做题,没有太深入研究过一些原理架构等细节。
这里简单介绍一下windows平台下的flask框架。MacBook请参考[(https://evoa.me/index.php/archives/47/ "flask快速开发")
1. 平台搭建。
操作系统:window 7 64bit 数据库:mysql5.6 python:v2.7 开发集成软件:PyCharm5.0
- 安装flask环境:
打开windows的命令行:pip install flask
- 安装flask-sqlalchemy包
打开cmd 输入E:\workdir\blog2>pip install flask-sqlalchemy
E:\workdir\blog2>python Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on wi n32 Type "help", "copyright", "credits" or "license" for more information. >>> >>> >>> >>> from flask_sqlalchemy import SQLAlchemy >>> >>>
flask框架已经搭好。
2.简单程序
E:\workdir\blog2>python Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on wi n32 Type "help", "copyright", "credits" or "license" for more information. >>> >>> >>> >>> from flask_sqlalchemy import SQLAlchemy >>> >>>
此程序现在仅可在本地运行,如果想在其他ip上运行需输入app.run(host='0.0.0.0')这是在公网ip在运行。
@app.route在此处相当于发挥了一个路由器的作用。```python
@app.route('/') def index(): return 'Index Page' @app.route('/hello') def hello(): return 'Hello World' ```
由于现在的web开发结构庞大,内容复杂,因此会在网站根目录分很多类,例如
app/admin,app/login,app/reset ,route功能即可将不同的文件分配到不同的子目录中。
变量规则
@app.route(<varial>) route()内的名称即为变量名。
构造 URL
如果 Flask 能匹配 URL,也可以生成。 url_for() 来给指定的函数构造 URL。它接受函数名作为第一个参数,也接受对应 URL 规则的变量部分的命名参数。未知变量部分会添加到 URL 末尾作为查询参数。
from flask import Flask,url_for app = Flask(__name__) @app.route('/') def index():pass @app.route('/login') def login():pass @app.route('/user/<username>') def profile(username): pass with app.test_request_context(): print url_for('index') print url_for('login') print url_for('login',next='/') print url_for('profile',username='hsy')
/
/login
/login?next=%2F
/user/hsy
反向构建通常比硬编码的描述性更好。更重要的是,它允许你一次性修改 URL, 而不是到处边找边改。
生成URL还可以进行HTTP请求,(post&get)
@app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': do_the_login() else: show_the_login_form()
更改路由请求的方式在app.route中修改。
静态文件
有时在调用文件时需要调用css,html等前端渲染模板,因此直接使用static静态文件即可调用。
url_for('static', filename='style.css')
模板渲染
from flask import render_template @app.route('/hello/') @app.route('/hello/<name>') def hello(name=None): return render_template('hello.html', name=name)
Flask 会在 templates 文件夹里寻找模板。所以,如果你的应用是个模块,这个文件夹应该与模块同级;如果它是一个包,那么这个文件夹作为包的子目录:
1.模块
/application.pyj /templates /hello.html
2.包
/application /__init__.py /templates /hello.html
环境局部变量
from flask import request with app.test_request_context('/hello', method='POST'): # now you can do something with the request until the # end of the with block, such as basic assertions: assert request.path == '/hello' assert request.method == 'POST'
request模块
from flask import request @app.route('/login',methods=['POST','GET']) def login(): error = None if 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)
Cookie:
- 读取cookie
from flask import request @app.route('/') def index(): username=request.cookies.get('username')
- 存储cookie
from flask import make_response @app.route('/') def index(): resp = make_response(render_templete(...)) resp.set_cookie('username','the username') return resp
响应
from flask import make_response @app.errorhandler(404) def not_found(error): resp=make_response(render_template('error.html'),404) resp.headers['X-Something']='A value' return resp
session:
from flask import Flask, session, redirect, url_for, escape, request app = 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 there session.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'
用蓝图实现模块化的应用
from flask import Blueprint,render_template,abort from jinja2 import TemplateNotFound simple_page = Blueprint('simple_page',__name__, template_folder='templetes') @simple_page.route('/',defaults={'page':'index'}) @simple_page.route('/<page>') def show(page): try: return render_template('pages/%s.html'%page) except TemplateNotFound: abort(404)
