一.安装flask
通过pip install flask
即可安装
二.第一个flask程序
用pycharm新建flask项目
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'hello,world'
if __name__ == '__main__':
app.run()
三.项目配置
一. 设置为DEBUG模式
二. 配置文件
创建config.py
,通过app.config.from_object(config)
导入
四.URL与视图
@app.route("/book/<string:book_id>",methods=['GET'])
def book_detail(book_id):
for book in books:
if book_id == str(book['id']):
return book
return f"id为{book_id}的图书没找到"
构造URL
book['url'] = url_for("book_detail",book_id=book['id'])
五.指定HTTP方法
六.页面跳转与重定向
@app.route("/profile")
def profile():
# 查询字符串
# 1.作为url的组成部分:/book/1
# 2.查询字符串:/book?id=1
usr_id = request.args.get("id")
if usr_id:
return "用户个人中心"
else:
return redirect(url_for("index"))
七.模板简介
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello'
@app.route('/about')
def about():
return render_template('about.html')
if __name__ == '__main__':
app.run()
@app.route('/about')
def about():
context = {
"username": "zhiliao"
}
return render_template('about.html',**context)
jinja2模板过滤器
<h1>我们是知了{{ username | length }}</h1>
<div>{{ books}}</div>
<div>{{ books|join(",") }}</div>
控制语句
<body>
{% if age > 18 %}
<div>您已成年</div>
{% elif age < 18 %}
<div>您未成年</div>
{% else %}
<div>您刚成年</div>
{% endif %}
</body>
八. 蓝图和子域名
from flask import Blueprint
bp = Blueprint("book",__name__,url_prefix="/book")
@bp.route('/list')
def book_list():
return '图书列表'
from flask import Flask
from apps.book import bp as book_bp
app = Flask(__name__)
app.register_blueprint(book_bp)
@app.route('/')
def hello_world():
return 'hello'
if __name__ == '__main__':
app.run()
九. SQLAlchemy ORM使用
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
DB_URI = 'mysql+pymysql://root:999888@127.0.0.1:3306/lflask'
app.config['SQLALCHEMY_DATABASE_URL'] = DB_URI
db = SQLAlchemy(app)
@app.route('/')
def hello_world():
engine = db.get_engine()
with engine.connect() as conn:
result = conn.execute("select 1")
print(result.fetchone())
return 'hello'
if __name__ == '__main__':
app.run()
定义模型和增删改查
定义模型
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__,static_url_path='/')
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:999888@localhost:3306/llflask'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app) # 实例化对象
# 定义ORM模型
class Article(db.Model):
__tablename__ = "article"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column('title',db.String(200),nullable=False)
content = db.Column(db.Text,nullable=False)
db.create_all()
if __name__ == '__main__':
app.run()
添加一条数据
@app.route('/article')
def article_view():
article = Article(title="钢铁是怎样炼成的",content="xxx")
db.session.add(article)
db.session.commit()
return "数据操作成功"
查询数据
@app.route('/article')
def article_view():
# 查询
article = Article.query.filter_by(id=1)[0]
print(article.title)
return "数据操作成功"
修改数据
@app.route('/article')
def article_view():
# 修改
article = Article.query.filter_by(id=1)[0]
article.content = "yyy"
db.session.commit()
return "数据操作成功"
删除数据
@app.route('/article')
def article_view():
# 删除
Article.query.filter_by(id=1).delete()
db.session.commit()
return "数据操作成功"
表关系
# 添加外键
author_id = db.Column(db.Integer,db.ForeignKey("user.id"))
# relationship
author = db.relationship("User",backref="articles")
Flask-Migrate插件
pip install flask-migrate
from flask_migrate import Migrate
app = Flask(__name__,static_url_path='/')
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:999888@localhost:3306/llflask'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app) # 实例化对象
migrate = Migrate(app,db)
初始化 flask db init
生成迁移脚本 flask db migrate -m "feat: xxx"
迁移 flask db upgrade
项目结构重构
循环引用问题
解决方法
创建exts.py
文件
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
然后再app和models中引用
app.py
from flask import Flask
from exts import db
from flask_migrate import Migrate
from models import Article,User,UserExtension
import config
app = Flask(__name__,static_url_path='/')
app.config.from_object(config)
# 把app绑定在db上
db.init_app(app)
migrate = Migrate(app,db)
models.py
from exts import db
# 定义ORM模型
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(200),nullable=False)
十.cookie和session
from flask import Flask,Response,request,session
app = Flask(__name__)
app.config['SECRET_KEY'] = 'sdkjgfdh36346'
@app.route('/set_cookie')
def set_cookie():
response = Response("cookie 设置")
response.set_cookie("user_id","xxx")
return response
@app.route('/get_cookie')
def get_cookie():
user_id = request.cookies.get("user_id")
print("user_id:",user_id)
return "读取cookie"
@app.route('/set_session')
def set_session():
session['username'] = 'zhiliao'
return 'session设置成功'
@app.route("/get_session")
def get_session():
username = session.get('username')
print("username",username)
return "get session"
@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'
if __name__ == '__main__':
app.run()
十一.Flask-WTF表单验证
import wtforms
from wtforms.validators import length,email
class LoginForm(wtforms.Form):
email = wtforms.StringField(validators=[length(min=5,max=20),email()])
password = wtforms.StringField(validators=[length(min=6,max=20)])
from flask import Flask,Response,request,session,render_template
from forms import LoginForm
app = Flask(__name__)
@app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'GET':
return render_template("login.html")
else:
form = LoginForm(request.form)
if form.validate():
return "登录成功"
else:
return "邮箱或密码错误"
if __name__ == '__main__':
app.run()
评论区