flask框架学习

搭建虚拟环境

安装virtualenv

1
pip3 install virtualenv

开辟虚拟空间

1
virtualenv flask-env

激活虚拟环境

1
2
3
linux/mac: source flask-env/bin/activate
windows: cd flask-env/Scripts 执行activate
退出虚拟环境: deactivate

虚拟环境安装flask

1
pip3 install flask

创建flask项目

我用pycharm创建一个flask项目,interpreter要选择自己的虚拟环境里的python.exe。然后就成功生成一个简单的模板。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from flask import Flask  #从flask这个框架中导入Flask这个类

# 初始化一个Flask对象
# Flask()
# 需要传递一个参数__name__
# 1.方便flask框架去寻找资源
# 2.方便flask插件比如Flask-Sqlalchemy出现错误的时候,找到问题所在的位置
app = Flask(__name__)

# @app.route 是一个装饰器
# @开头,并且在函数的上面,说明是装饰器
# 这个装饰器的作用,是做一个url与视图函数的映射
# 127.0.0.1:5000/ ->去请求hello_world这个函数,然后将请求结果返回给浏览器
@app.route('/')
def hello_world():
return "Hello chenxiyuan"

# 若果当前文件是作为入口程序运行,那么就执行app.run()
if __name__ == '__main__':
# app,run()
# 启动一个应用服务器,来接受用户的请求
# while True:
# listen()
app.run()

debug

debug模式,在pycharm里启动配置中要勾选FLASK_DEBUG

1
app.run(debug=True)

使用配置文件

新建config.py

1
DEBUG = True

主程序

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask
import config
app = Flask(__name__)
app.config.from_object(config)

@app.route('/')
def hello_world():
return "Hello world"

if __name__ == '__main__':
app.run()

url传参数

1
2
3
@app.route('/a/<id>') #参数放在<>中
def a(id):
return u"您请求的参数是:%s" % id

url反转

url_for函数,视图函数的名称作为参数,返回视图函数的url。

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask,url_for
app = Flask(__name__)

@app.route('/')
def index():
return url_for('a',id=1)
@app.route('/list/<id>')
def a(id):
return u"您请求的参数是:%s" % id
if __name__ == '__main__':
app.run()

页面跳转和重定向

redirect()

Jinja2模板

模板渲染和参数

  1. 模板放在templates文件夹下
  2. 从flask中导入render_template
  3. 模板传参:创建一个字典,在render_template函数中使用**传入
  4. 1
    html里用{{}}包含变量
  5. 参数也可以是对象和字典

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from flask import Flask,render_template
    app = Flask(__name__)

    @app.route('/')
    def index():
    class Person:
    name = "廉天龙"
    age = 19
    p = Person()
    context ={'username':'chenxiyuan','gender':'男','age':'19','person':p}
    return render_template('index.html',**context)

    if __name__ == '__main__':
    app.run()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>用户名:{{ username }}</p>
<p>性别:{{ gender }}</p>
<p>年龄:{{ age }}</p>
<hr>
<p>名字:{{ person['name'] }}</p>
<p>年龄:{{ person.age }}</p>
</body>
</html>

if语句

1
2
3
4
5
使用 {% if 条件 %}
...
{% else %}
...
{% endif %}

for语句

1
2
3
{% for 条件 %}
...
{% endfor %}

过滤器

|符号后接过滤器,本质是函数。

  1. default过滤器

    1
    {{arg|default('...')}}#变量不存在取默认
  2. length过滤器
    返回长度

    继承和block

    父模板要写,子模板要写自己的内容一定要放在block里

    1
    2
    3
    4
    {% extends 'base.html' %}
    {% block name %}
    ...
    {% endblock %}

加载静态文件

url_for(‘static’,filename=’路径’)

  1. 加载css

    1
    <lin rel="stylesheet" href="{{url_for('static',filename='css/index.css')}}">
  2. 加载js

    1
    <script src="{{url_for('static',filename='js/index.js')}}"></script>

SQLAlchemy数据库

ORM与flask_sqlalchemy

  1. ORM: Object Relationship Mapping (模型关系映射)
  2. flask_sqlalchemy是一套ORM框架
  3. pip install flask_sqlalchemy

    SQLAlchemy使用

  4. 设置配置信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #新建config.py
    #配置格式:dialect+driver://username:password@host:port/database
    DIALECT = 'mysql'
    DRIVER = 'pymysql'
    USERNAME = 'root'
    PASSWORD =''
    HOST = '127.0.0.1'
    PORT = '3306'
    DATABASE = 'test'
    SQLALCHEMY_DATABASE_URI="{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)
  5. 调用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy

    import config
    app = Flask(__name__)
    app.config.from_object(config)
    db = SQLAlchemy(app)
    db.create_all()
    # 如果没有报错说明配置正确

SQLAlchemy模型与表映射

  1. 模型需要继承自db.Model,然后需要映射到表中的属性必须写成db.Column的数据类型
  2. 例子
    1
    2
    3
    4
    5
    6
    7
    class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title =db.Column(db.String(100),nullable=False)
    content =db.Column(db.Text,nullable=False)
    db.create_all()
    #这时候就可以在数据库中看到已经生成了一张表

SQLAlchemy增删改查

  1. 1
    2
    3
    article1 =Article(title='aaa',content='bbb')
    db.session.add(article1)
    db.session.commit()
  2. 1
    2
    article1 =Article.query.filter(Article.title=='aaa').first()
    print(article1.title,article1.content)
  3. 1
    2
    3
    4
    # 先查询改后再提交
    article1 =Article.query.filter(Article.title=='aaa').first()
    article1.title= 'ccc'
    db.session.commit()
  4. 1
    2
    3
    4
    # 先查再delete后提交
    article1 =Article.query.filter(Article.title=='ccc').first()
    db.session.delete(article1)
    db.session.commit()

SQLAlchemy外键约束

  1. db.ForeignKey(‘table.column’)
  2. db.relationship(‘table’,db.backref=(‘…’))
  3. db.Table

    flask操作session

  4. 要从flask中导入session
  5. 要设置一个SECRET_KEY

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from flask import Flask,session
    import os
    app = Flask(__name__)
    app.config['SECRET_KEY']=os.urandom(24)

    @app.route('/')
    def hello_world():
    session['username'] = 'chenxiyuan'

    return 'Hello World!'
  6. 删除

    1
    2
    session.pop('username')
    session.clear()
  7. 获取

    1
    session.get('username')
  8. 过期时间

    1
    2
    session.permanent =True
    app.config['PERMANENT_SESSION_LIFETIME']= timedelta(days=7)