debug 模式
app.run(debug==True)
错误信息会在浏览器中显示
热部署
支持外部访问
—host=0.0.0.0
—port=8000
@app.route(“/“)
def hello_world():
return render_template(“index.html”)
# return “hello_world”
@app.route(<int:blog_id>)
Def …(blog_id):
Return …”is : %s” % blog_id
<blog_id>
Def …(blog_id):
Return …”is : %s” % blog_id
渲染html
访问成员
传如参数
过滤器
def datetime_format(value,format=“%Y-%d-%m %H:%M”):
return value.strftime(format)
app.add_template_filter(datetime_formate,”dformat”)
# dformat. is just name
自定意过滤器
dformate 为 名字
可以实现一些简单的操作
Class User:
def __init__(self,username,email)
self.username=username
self.email=email
@app.route(‘/’)
def hello_world():
user=User(username=“治疗”,email=“qq.com”)
return user.name
{%if if%}
{%else if. %}
{else }
{%endif% }
{{name.value}}
..
{% extends "base.html" %}
....
base.html
{%block title%}{%endblock%}
child1.html
{%block title%}..{%endblock%}
pymysql
pip intall pymysql
flask-sqlalchemy
......falsk........
..flask........
HOSTNAME=“127.0.0.1”
PORT-=3306
USERNAME=“root”
PASSWORD=“”
DATABASE=“database_learn”
app.config[‘SQLALCHEMY_DATABASE_URI’] = f”mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf-8”
db=SQLAlchemy(app)
# test can use or not
with db.engine.connect() as conn:
rs=conn.execute(“select 1”)
print(reps.fetchone())
ORM
user=User(username=“…”,password=“…”)
db.session.add(user)
db.session.commit()
return “用户创建成功”
查找
def query_user():
# get 查找 ;根据主键
User.query.get(1)
print(f”{user.id}:{user.username}—-{user.password}”)
users=User.query.filter_by(username=“…”)
for user in Users:
print(user.username)
return “查找成功”
update
@app.route(“/user/update”)
def update_user():
user=User.query.filter_by(username=“…”).first
#why first ? when got nothing got null not Exception
user.password =“22222”
db.session.commit()
return “数据修改成功 ”
del
find->del->commit()
user=User.query.get(1)
db.session.delete(user)
db.session.commit()
上下文出问题
withapp.app_context():
要执行的内容
# 涉及到外键
class User(db.Model):
__tablename__=“user”
id=db.Column(db.Integer,primary_key=Ture,autoincrement=True)
userame=db.Column(db.String(100),nullable=False)
password=db.Column(db.String(100),nullable=False)
class Article(db.Model):
__tablename__=“article”
】id=db.Column(db.Integer,primary_key=Ture,autoincrement=True)
titile=db.Column(db.String(100),nullable=False)
content=db.Column(db.String(100),nullable=False)
构建项目
config.py
数据库连接信息
models.py
from exits import db
class UserModel(db.Model):
__tablename__=“user”
id=db .Column(db.Inter,primary_key=True,autoincrement=True)
username=db.Column(db.String(100),nullable=False)
password=db.Column(db.String(100),nullable=False)
email=db.Column(db.String(100),nullable=False,unique=True)
join_time=db.Column(db.Datetime,default=datetime.now)
auth.py
from flask import Blueprint
bp=Bludprint(“auth”,__name__,url_prefix=“/auth”)
@bp.route(“/login”)
def login():
pass
app.py
from exits import db
from models import UserModel
from blueprints.qa import bp as qa_bp
from bludprints.auth import bp as auth_bp
from flask migrate import Migrate
app=Flask(__name__)
app.config.from_object(config)
db.init_app(app)
migrate =Migrate(app,db)
app.register_blueprint(qa_bp)
app.register_blueprint(auth_bp)
console
flask db init
flask db migrate
flask db upgrade
auth.py
from flask import Blueprint
bp=Bludprint(“auth”,__name__,url_prefix=“/auth”)
@bp.route(“/login”)
def login():
pass
# update auth.py add
@bp.route(“/register”)
def register():
return render-template(“register.html”)
# html’s css can’t use
you use render_template ,and it did not support relative path
herf=“./css/a.css”
herf={{url_for(‘css’,filename=‘a.css ’)}}
jingja2
flask-mail
ex qqmail
开启pop3/smtp
config.py
MAIL_SERVER=“smtp.qq.com”
# if 163 163
MAIL_SER_SSL=True
MAIL_PORT=456
MAIL_USERNAME=“邮箱账号”
MAIL_PASSWORD=“开启SMTP服务时产生的授码”
MAIL_DEFAULT_SENDER+”邮箱账号”
exits.py
循环引用
1->2
2->1
1->2
2->3
3->1
还是循环
可以尝试切断第二个中的一个链接,然后反过来引用,即在用的时候创建
exits.py
from flask_sqlalchemy import SQLAlchemy
from flask_mail import Mail
db=SQLAlchemy
mail =Mail()
app.py
from exits import mail
mail.init_app(app)
auth.py
from exits import mail
from flask_mail import message
@bp.route(“/mail/test”)
def mail_test():
message=Message(subject=“邮箱测试”,recipients=[“22@qq.com”],body=“这是一个测试邮件”)
mail.send(message)
return “发送成功”
auth.py
@bp.route(“/captcha/email”)
def get_mail_captcha():
email=request.args.get(“email”)
# import sting random
source= string.digits*4
captcha=random.sample(source,4)
captcha=“”,join(captcha)
# 调用test中的message方法,发送
email_capthca=EmailCatchaModel(email=email,captcha=captcha)
db.session.add(email_captcha)
db.session.commit()
return jsonify({ “code”:200,”message”:””,”data”:None})
class EmailCatchaModel(db.Model):
__tablename__=“email_capcha” id=db .Column(db.Inter,primary_key=True,autoincrement=True) email=db.Column(db.String(100),nullable=False,unique=True)
captcha=db.Column(db.Stirng(100))
加载完成后执行
$(function(){
$(“#captchabtn”).click(function(evvent{
event.precentDefault();
var email=$(“innput”[name]=‘email’).val();
$.ajax({
url:”/auth/capture/email”,
method:”GET”,
success:function(result){
console.log(result);
if(code==200){
alter(“验证码发送成公”);
}
else{
alter(result[‘message’]);
}
}
fail:function(error){
console.log(error);
}
# route 默认get请求
# @bp.route(“/capatcha/email?emal=xx@qq.com”,method=[‘post’])
})
});
})