Jusene's Blog

Flask框架入门

字数统计: 1.2k阅读时长: 5 min
2017/12/04 Share

Flask

Flask python web微框架,微框架不意味着Flask在功能上有所欠缺,微框架的“微”意味着Flask旨在保持核心简单而易于扩展,Flask不会为我们做出太多决策,所以这里的一切都是由自己掌控。

Flask安装使用

Flask的安装在PYPI源中就已经存在,所以我们可以使用pip安装,如果需要安装最新版本的Flask可以下载github的版本:http://github.com/mitsuhiko/flask.git

1
~]# pip install -U flask

最小的Flask应用:

1
from flask import Flask
2
app=Flask(__name__)
3
4
@app.route('/')
5
def index():
6
  return 'hello flask'
7
if __name__ == '__main__':
8
  app.run(host=0.0.0.0,debug=True)
  • 首先,导入Flask类,这个类的实例是WSGI应用程序。
  • 接下来创建一个该类的实例,第一个参数是应用模块或者包的名称。
  • 然后,使用route()装饰器告诉Flask什么样的URL触发什么样的函数。
  • 这个函数的名称也在生成URL时被特定的函数采用,这个函数返回我们想要显示在用户浏览器中的信息。
  • 最后我们用run()函数来让应用运行在本地服务器上。

注意:调试模式在生产环境绝对不可开启,调试模式将可以执行任意代码。

站点路由

我们知道route()装饰器把一个函数绑定到对应的URL上。

1
@app.route('/index')
2
def index():
3
  return 'Index Page'

URL变量添加,url上的命名参数传递到你的函数,这个变量支持三种:(1)int(2)float(3)path

1
@app.route('/student/<name>')
2
def show_name(name):
3
  return 'student {}'.format(name)
4
5
@app.route('/grade/<int:score>')
6
def show_score(score):
7
  return 'score {}'.format(score)
8
9
@app.route('/high/<float:hig>')
10
def show_high(hig):
11
  return 'high {}'.format(hig)

注意:

1
@app.route('/about/')   #访问/about将会重定向/about/,这个url会被匹配
2
def index():
3
  return "about page"
4
5
@app.route('/about')    #访问/about将会重定向/about/,这个url不会被匹配,404
6
def index():
7
  return 'about page'

构造URL

1
from flask import Flask,url_for
2
app=Flask(__name__)
3
4
@app.route('/')
5
def index():pass
6
@app.route('/login')
7
def login():pass
8
@app.route('/user/<username>')
9
def profile(username):pass
10
11
with app.test_request_context():
12
  print(url_for('index'))
13
  print(url_for('login'))
14
  print(url_for('login',user='js')
15
  print(url_for('profile',username='zhang jusene'))
1
~]# python view.py
2
/
3
/login
4
/login?user=js
5
/user/zhang%20jusene

HTTP方法

默认情况下路由只回应GET请求,但是route()装饰器可以改变methods参数可以改变这个行为。

1
@app.route('/login',methods=['GET','POST'])
2
def login():
3
  if request.method == 'POST':
4
    do_auth()
5
  else:
6
    do_redirect()

静态文件

Flask框架默认为我们设置了一些默认值,从上面我么可以知道url_for的对象是函数,而Flask为了可以获得静态文件,默认构造了static这个函数,如我们想要访问static/main.css:

1
url_for('static',filename='main.css')  #构造出静态资源url

模版渲染

Flask配备了jinja2模版引擎,可以使用render_template()方法来渲染,而这个template默认在同级的templates的目录下。

1
from flask import Flask,render_template
2
app=Flask(__name__)
3
@app.route('/hello/<name>')
4
def hello(name=None):
5
  return render_template('hello.html',name=name)
1
~]# cat templates/hello.html
2
<!doctype html>
3
<title>Hello Flask</title>
4
{% if name %}
5
  <h1>Hello {{name}}</h1>
6
{% else %}
7
  <h1>Hello World</h1>
8
{% endif %}

请求对象

1
from flask import Flask,request
2
app=Flask(__name__)
3
@app.route('/',methods=['GET','POST'])
4
username=request.args.get('username')
5
password=request.form['password']

重定向和错误

1
from flask import Flask,abort,redirect,url_for
2
app=Flask(__name__)
3
@app.route('/')
4
def index():
5
  return redirect(url_for('login'))
6
7
@app.route('/login')
8
def login():
9
  abort(401)

定制错误页面

1
from flask import Flask,render_template
2
app=Flask(__name__)
3
4
@app.errorhandler(404)
5
def page_not_found(error):
6
  return render_template('page_not_found.html'),404

响应

1
from flask import Flask,make_responce
2
app=Flask(__name__)
3
4
@app.errorhandler(404)
5
def not_found(error):
6
    resp = make_response(render_template('error.html'), 404)
7
    resp.headers['X-Something'] = 'A value'
8
    return resp

存储cookie

1
from flask import make_response
2
3
@app.route('/')
4
def index():
5
    resp = make_response(render_template(...))
6
    resp.set_cookie('username', 'the username')
7
    return resp

读取cookie

1
from flask import request
2
3
@app.route('/')
4
def index():
5
    username = request.cookies.get('username')

session

session允许在不同的请求间存储特定用户的信息,基于cookie实现,并且对于cookie进行了密钥签名。

1
from flask import Flask,session,redirect,url_for,escape,request
2
3
app=Flask(__name__)
4
app.secret_key='1qazxsw2'
5
@app.route('/')
6
def index():
7
  if 'username' in session:
8
    return 'Logged in as %s' % escape(session['username'])
9
  return 'You are not logged in'
10
@app.route('/login',methods=['GET','POST'])
11
def login():
12
  if request.method == 'POST':
13
    session['username'] = request.form['username']
14
    return redirect(url_for('index'))
15
  return '''
16
      <form action="http://127.0.0.1:5000/login" method="post">
17
        <p><input type=text name=username>
18
        <p><input type=submit value=Login>
19
      </form>
20
      '''
21
@app.route('/loginout')
22
def loginout():
23
  session.pop('username',None)
24
  return redirect(url_for('index'))

log

从Flask 0.3 开始,Flask 就已经预置了日志系统。

1
app.logger.debug('A vlaue for debug')
2
app.logger.error('An error occurred')

具体的配置需要参考logging库。

CATALOG
  1. 1. Flask
  2. 2. Flask安装使用
  3. 3. 站点路由
  4. 4. 构造URL
  5. 5. HTTP方法
  6. 6. 静态文件
  7. 7. 模版渲染
  8. 8. 请求对象
  9. 9. 重定向和错误
  10. 10. 响应
  11. 11. cookie
  12. 12. session
  13. 13. log