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/

 

posted @ 2019-05-04 22:45  F君君  阅读(238)  评论(0编辑  收藏  举报