搭建虚拟环境
安装virtualenv1
pip3 install virtualenv
开辟虚拟空间1
virtualenv flask-env
激活虚拟环境1
2
3linux/mac: source flask-env/bin/activate
windows: cd flask-env/Scripts 执行activate
退出虚拟环境: deactivate
虚拟环境安装flask1
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
24from 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这个函数,然后将请求结果返回给浏览器
def hello_world():
return "Hello chenxiyuan"
# 若果当前文件是作为入口程序运行,那么就执行app.run()
if __name__ == '__main__':
# app,run()
# 启动一个应用服务器,来接受用户的请求
# while True:
# listen()
app.run()
debug
debug模式,在pycharm里启动配置中要勾选FLASK_DEBUG1
app.run(debug=True)
使用配置文件
新建config.py1
DEBUG = True
主程序1
2
3
4
5
6
7
8
9
10
11from flask import Flask
import config
app = Flask(__name__)
app.config.from_object(config)
def hello_world():
return "Hello world"
if __name__ == '__main__':
app.run()
url传参数
1 |
|
url反转
url_for函数,视图函数的名称作为参数,返回视图函数的url。1
2
3
4
5
6
7
8
9
10
11from flask import Flask,url_for
app = Flask(__name__)
def index():
return url_for('a',id=1)
def a(id):
return u"您请求的参数是:%s" % id
if __name__ == '__main__':
app.run()
页面跳转和重定向
redirect()
Jinja2模板
模板渲染和参数
- 模板放在
templates
文件夹下 - 从flask中导入render_template
- 模板传参:创建一个字典,在render_template函数中使用**传入
1
html里用{{}}包含变量
参数也可以是对象和字典
1
2
3
4
5
6
7
8
9
10
11
12
13
14from flask import Flask,render_template
app = Flask(__name__)
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 |
|
if语句
1 | 使用 {% if 条件 %} |
for语句
1 | {% for 条件 %} |
过滤器
|符号后接过滤器,本质是函数。
default过滤器
1
{{arg|default('...')}}#变量不存在取默认
length过滤器
返回长度继承和block
父模板要写
,子模板要写自己的内容一定要放在block里
1
2
3
4{% extends 'base.html' %}
{% block name %}
...
{% endblock %}
加载静态文件
url_for(‘static’,filename=’路径’)
加载css
1
<lin rel="stylesheet" href="{{url_for('static',filename='css/index.css')}}">
加载js
1
<script src="{{url_for('static',filename='js/index.js')}}"></script>
SQLAlchemy数据库
ORM与flask_sqlalchemy
- ORM: Object Relationship Mapping (模型关系映射)
- flask_sqlalchemy是一套ORM框架
- pip install flask_sqlalchemy
SQLAlchemy使用
设置配置信息
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)调用
1
2
3
4
5
6
7
8
9from 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模型与表映射
- 模型需要继承自db.Model,然后需要映射到表中的属性必须写成db.Column的数据类型
- 例子
1
2
3
4
5
6
7class 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
2
3article1 =Article(title='aaa',content='bbb')
db.session.add(article1)
db.session.commit()查
1
2article1 =Article.query.filter(Article.title=='aaa').first()
print(article1.title,article1.content)改
1
2
3
4# 先查询改后再提交
article1 =Article.query.filter(Article.title=='aaa').first()
article1.title= 'ccc'
db.session.commit()删
1
2
3
4# 先查再delete后提交
article1 =Article.query.filter(Article.title=='ccc').first()
db.session.delete(article1)
db.session.commit()
SQLAlchemy外键约束
- db.ForeignKey(‘table.column’)
- db.relationship(‘table’,db.backref=(‘…’))
- db.Table
flask操作session
- 要从flask中导入session
要设置一个SECRET_KEY
1
2
3
4
5
6
7
8
9
10from flask import Flask,session
import os
app = Flask(__name__)
app.config['SECRET_KEY']=os.urandom(24)
def hello_world():
session['username'] = 'chenxiyuan'
return 'Hello World!'删除
1
2session.pop('username')
session.clear()获取
1
session.get('username')
过期时间
1
2session.permanent =True
app.config['PERMANENT_SESSION_LIFETIME']= timedelta(days=7)