1.Flask 使用app.config来进行对象配置
app.config['SECRET_KEY']="xxx"
2.可以把配置项目放到单独一个文件里面
通过,app.config.from_object() 来加载
setting.py
SECRET_KEY = "FFDSFDS4F65DS4FD5S4F32D4F"
app.py
import setting
app.config.from_object(setting)
3.app.config['JSON_AS_ASCII']=False
这个设置的结果是 返回的json格式得中文不会变乱码
1.@app.route("/book"int:book)
def book_detail(book)
这样是把从url输入的值传到函数里面进行使用,int:的作用是限定输入的必须是int类型
暂时性重定向 redirect,状态码是302
在app.py里面可以使用return redirect(url_for("book"))
但不要redirect 自己
1.render_template 是渲染模板的
这个模板默认去templates里面找
如果要更改的话:这个方法
2.可以传数据到html里面"**context"
context 是要个字典来的
这样,才html中就可以通过
过滤器的讲解,具体可以去知了的课件里面去看
比如,字符长度 可用 {{username|length}}
|是管道,表示过滤东西
if控制语句的讲解
用{% if age > 18%}
div
最好要使用{% endif %}来结束
for 语句的讲解
模板继承的方法
在base html中 要预留位置给别人用{% block title %}{% endblock %}
子模板要继承base模板的话, 开头要加上 {% extend "base.html" %}
静态文件的加载存放方法
css文件加载方法:
蓝图
将不同功能的API 放在不同页,规整管理
不同页那 用 student_bp = Blueprint("student",name,url_prefix="/student") 生产蓝图
将bp 导入到app.py内。 用 app.register_blueprint(student_bp ) 来注册蓝图
注意,不要忘记了"/"个符号
1.安装mysql数据库 和 DBeaver
1.SQLALchemy d的安装
2.安装方法:pip install flask-sqlalchemy
这里还有用到另外一个库 pymsql
3.数据库连接的方法是
DB_URI = "mysql+pymysql://{username}:{password}@{hostname}:{port}/(DB name)?charset=utf8"
如"mysql+pymysql://root:mysql@localhost:3306/evans?charset=utf8"
4.连接的app的方法,转给app.方法
app.config["SQLALCHEMY_DBTABASE_URI"]=DB_URI
创建db实例
db = SQLALchemy(app)
db 这个实例要在函数外面就创建好
5.
可以增加这一句,让系统明确是否跟踪每次的修改
1.创建表的方法
class Article(db.Model):
tablename = "article"
id = db.Column(db.Inter,primary_key=True,autoincrement=True)# 自动增长
title = db.Column(db.Strint(32),nullable=False)#不可以为空
content = db.Column(db.Text,nullable=False)# 内容用Text类线, 如果用String 只有256个字符
2.创建的方法
db.create_all()
3.添加数据
article = Article(title"钢铁是怎样炼成的",content="xxx")
修改和添加都要添加的
db.session.add(article)
db.session.commit()
添加多组数据的方法 把对象组合成一个列表放在括号内
db.session.add_all([article1,article2,article3,article4])
4.查询数据
filter_by:返回一个类列表的对象
article = Article.query.filter_by(id=1)[0]
print(article.content)
5.修改数据
article = Article.query.filter_by(id=1)[0]
article.content = "这个是修改后的数据"
db.session.commit()
6.删除数据
article = Article.query.filter_by(id=1).delete()
db.session.commit()
class User(db.Model):
tablename = 'user'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(200),nullable=False)
articles = db.relationship('Article',backref='user')
class Article(db.Model):
tablename = "article"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(200),nullable=False)
content = db.Column(db.Text,nullable=False)
1.外键 db.Foreign("表名.字段名") author_id = db.Column(db.Interger,db.ForeignKey("user.id"))
一对多 添加数据 db.session.add(user)主要添加user即可,因为article已经添加到user里面了,会自动随着user添加而添加的
user = User(username="evans")
article = Article(title="article1",content="content1")
user.articles=[article]
因为articles是对多的,所以,要添加一个列表,故增加一个括号
db.session.add(user)
db.session.commit()
一对多查询时,需要增加一个first(),不然无法定位到该数据
user = User.query.filter(User.username=="evans").first() 这个first()一定不要忘了哦
articles = user.articles
for art in articles:
print(art.content)
SQLAlchemy 使用query查询的时,可以使用filter()和filter_by() 过滤条件。
filter_by() 参数直接用属性名,比较用一个=
如:filter_by(name='yoyo', age=20).all()
filter() 参数 用类名.属性名,比较用 ==
如:filter() 除了可以支持判断等于,还可以支持 大于 (>)和小于 (<)和 and_、or_、like、in_查询
session.query(Students).filter(and_(Students.name == 'yoyo', Students.age == 20)).all()
一定要加.all() 或者.first()
from flask_migrage import Migrate
migrate = Migrate(app,db)
划重点,文件名必须是app.py,不然Migrate无法找到文件
flask db init
flask db migrate -m "注释语"
flask db upgrate
使用ml margin_left, 也有mr,mt,mb
-1(*0.25);-2;-3;-4
使用pl padding_left, 也有pr,pt,pb
-1;-2;-3;-4
ml-auto 表示 靠右
mr-auto 表示 靠左
form-group 的效果 用于div
form-group将同一个form组的内容放在一起,bootstrap给组与组之间加了一定的间距,类似段落
form-control 的效果 用于div 下面的标签
1、宽度变成了100%
2、设置了一个浅灰色(#ccc)的边框
3、具有4px的圆角
4、设置阴影效果,并且元素得到焦点之时,阴影和边框效果会有所变化
5、设置了placeholder的颜色为#999
btn-block 是让按钮占满父级标签
这样,一点就名称就定位的input 框内
借助到一个flask-mail插件来实现
from flask_mail import Mail
如下是配置项:
MAIL_SERVER = "smtp.qq.com"
MAIL_PORT = 465
MAIL_USE_TLS = False
MAIL_USE_SSL = True
MAIL_DEBUG = False
MAIL_USERNAME = "509550976@qq.com"
MAIL_PASSWORD = "usbrqrxmyrizcagg"
MAIL_DEFAULT_SENDER = "509550976@qq.com"
mail = Mail()
mail.init_app(app) 把app传进去
from flask_mail import Message
message = Message(
subject="测试用邮件",
recipients=["liwendongapt@163.com","wendong.li@solu-m.com"],
body="测试邮件")
mail.send(message)这样就可以发送邮件了
验证码的提取
class EmailCaptchaModel(db.Model):
tablename = "email_captcha"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
email = db.Column(db.String(100),nullable=False,unique=True)
captcha = db.Column(db.String(10),nullable=False)
create_time = db.Column(db.DateTime,default=datetime.now) now 后面不用加括号,不然就会成为调取的时间。
letters = string.ascii_letters+string.digits
string.ascii_letters 字母,大小写包括
string.digits 阿拉伯数字
request.args.get('mail')只是用get的方法获取邮箱
$.ajax是在js上与api传输数据的方法
$.ajax({
url:"/user/captcha",
method:"POST",
data:{
"email":email},
success:function(res){
var code = res['code'] 这里的res就是api上返回的json字典,res['code']是键为"code"的值.
}
$('#captcha-btn').click(function(){
click_event =$(this)
click_event.off("click")关闭按钮功能
利用hash来加密密码
加密的方法:hash_password = generate_password_hash(password)
匹配的方法:check_password_hash(usermodel.password,password)
flash的使用方法
在后段产生一下flash("密码和邮箱不匹配")
这样,可以自动传到前端,只有出错是才会显示,所以导入一个for循环看是否有这个值。
用get_flashed_messages()来获得后端传过来的值,并在合适的地方显示
{%for message in get_flashed_messages()%}
模板继承
<title>{% block title %}{% endblock %}</title>
@app.before_request 这个就是每次请求刷图函数是会先访问的钩子函数
def before_request():
user_id = session.get("user_id") 先去session 看看是否有 user_id 的值
if user_id: 有的话,去数据库获取该user的数据库对象
user = UserModel.query.filter_by(id=user_id).first()
g.user = user 让g这个全局变量的键user的值为user对象 ,那么,就是在视图函数上确认g.user 在不在,在就表示已经登录
下面这个是上下文处理器,这个是当视图函数返回一个视图时,会先执行这个函数,生成一个字典{"user":g.user},传给视图,
那么可以在视图上判断user是否在,在就显示{% if user %}
@app.context_processor
def context_processor():
if hasattr(g,"user"):
return {"user":g.user}
else: return {}
session.clear()
test - 判断字符串是否符合规定的正则
exec - 获取匹配的数据
1.创建字符串的方法rep = /\d+/
用//做开头语结尾
2.开始符号^; 结尾符号$
3.做验证的方法,res = /\d+/
res.test(str) -->true of false 只有里面有数字就true
4.如果全部时数字,需要这样,res = /^\d+$/
->开始符号^; 结尾符号$
5./b时空格; /w+ 英数字加下划线串
6./\bjava/w*/b/g 加个g 代表时迭代匹配,每执行一下,会匹配下一个
在html中,Field="string" 指支持字母数字下划线; 如果 Field="string" range='4-40',代表只能4~40个字符;
mobile='true' 代表符合手机规则; min-len='6'; comfirm-to='pwd' 'pwd'时name, 代表要与name的那个值一致
7.CSS根据调解可变设置()
@media(min-width:700px){
c2{XXX:XXX}
}
在package 文件夹内(有__init__.py)导入 该文件夹的py ,需要加 ., 如
1.ERROR [flask_migrate] Error: Target database is not up to date.
db flask migrate 时出现这句,要将migrate文件中最新的那个文件的版本号放的 数据库里面alembic_version 里面,替换掉
布局方法:
display:flex
这样设置后就可以用下面的参数了
flex-grow: 1;表示按比例占用剩余的长度或宽度,是0代表不自动扩大,如果是n(n>1) ,则所占空间是1的 n倍
flex-shrink:一个元素不设置或者flex-shrink设置为1,默认会压缩元素的宽度,设置为0,则按原来长度
flex-basis:用于设置下面的每个div的长度
flex:1 就是flex-grow,flex-shrink,basis的缩写。
api 里面要用用有参数的url时,用
@bp.route("/question/int:question_id")
def question_detail(question_id):
question = QuestionModel.query.filter_by(id=question_id).first()
return render_template("detail.html",question=question)
在html里面
input 要加上 class="form-control" (bootstrap)下面这里,知道了一个answer,要去查找只在,就要通过外键去找,方法不是answer.author_id.username,而是 answer.user.username
class AnswerModel(db.Model):
tablename = "answer"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
content = db.Column(db.Text,nullable=False)
question_id = db.Column(db.Integer,db.ForeignKey("question.id"))
author_id = db.Column(db.Integer,db.ForeignKey("user.id"))
create_time = db.Column(db.DateTime,default=datetime.now)
question = db.relationship('QuestionModel',backref=db.backref('answers',order_by=create_time.desc()))
通过question 来查找answer时,我们希望排列顺序是最新的到最晚,那么,通过relationship来定位到answers 时,用backref=db.bachref('answers',order_by=create_time.dsec()))