Flask入门
什么是Flask?
用于搭建Web应用的微框架。说其“微”,是指其核心足够简单,可扩展,与Django的理念相反。
(web development, one drop at a time vs the web framwork for perfectionists with deadlines)
只要创建好app,做好路由映射(基于装饰器),马上就可以让Flask运转起来
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "Hello World!" if __name__ == "__main__": app.run()
访问本机的5000端口,就能看到结果。
功能初探
可定义多映射
@app.route('/index') @app.route('/') def index(): return “home page“
可定义访问方法,参数和参数类型,
@app.route('/profile/<int:uid>', methods=['GET', 'POST']) def profile(uid): return "profile", str(uid)
获得请求信息,定义响应信息
from flask import make_response, request @app.route('/request') def request_demo(): res = '' key = request.args.get('demo_key', 'default_value') res = res + request.url + '++' + request.path + '<br>' for property in dir(request): res = res + str(property) + '|==|<br>' + str(eval('request.' + property)) + '<br>' response = make_response(res) response.set_cookie('cookie_key', key) response.status = '404' response.headers['header_key'] = 'header_value' return response
重定向和处理错误
from flask import redirect @app.route('/redirect_target') def redirected(): return 'target' @app.route('/from_here') def redirect_demo(code): return redirect('/redirect-target') @app.errorhandler(404) def page_not_found(error): return render_template('not_found.html')
在前后请求之前传递信息,有消息闪现(Message Flashing)机制
from flask import flash, get_flashed_messages @app.route('/login') def login(): # 每登录一次都为把消息压入消息队列中,首页的提示信息会一直增加 flash('登录成功') return 'ok' @app.route('/') def index(): res = '' for msg in get_flashed_messages(): res = res + msg + '<br>' return res
Jinja2模板
{% extends "base.html" %} <title>{% block title %}{% endblock %}</title> <ul> {% for user in users %} <li><a href="{{ user.url }}">{{ user.username }}</a></li> {% endfor %} </ul>
可安装flask_script模块为Flask编写外部脚本,方便进行调试和管理
from flask_script import Manager from demo import app manager = Manager(app) @manager.command def hello(name): print('hello', name) @manager.command def initialize_database(): """initialize database""" print('database started.') if __name__ == '__main__':
# 默认有runserver命令,启动server manager.run()
python manage.py hello demo python manage.py initialize_database python manage.py runserver
ORM
from flask_ins import db class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(80), unique=True) password = db.Column(db.String(32)) # 头像 head_url = db.Column(db.String(236)) # 用户可以有多张图片,一对多 images = db.relationship('Image', backref='user', lazy='dynamic') def __init__(self, username, password): self.username = username self.password = password # 调用unsplash的接口,生成随即图片 self.head_url = get_image_url(icon_url) def __repr__(self): return '<User %d %s>' % (self.id, self.username) class Image(db.Model): __tablename__ = 'image' id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 外键,与relationship搭配使用 user_id = db.Column(db.Integer, db.ForeignKey('user.id')) url = db.Column(db.String(512)) created_date = db.Column(db.DateTime) def __init__(self, url, user_id): self.url = url self.user_id = user_id self.created_date = datetime.now() def __repr__(self): return'<Image %d %s>' % (self.id, self.url)
参考资料:
http://flask.pocoo.org/docs/1.0/
http://jinja.pocoo.org/docs/2.10/
https://flask-script.readthedocs.io/en/latest/