ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

零基础玩转Python Flask框架-学完可就业 笔记

2022-08-30 13:01:12  阅读:429  来源: 互联网

标签:filter Python app db Column Flask user 学完 id


P5.

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格式得中文不会变乱码

p6

1.@app.route("/book"int:book)
def book_detail(book)
这样是把从url输入的值传到函数里面进行使用,int:的作用是限定输入的必须是int类型

P8

暂时性重定向 redirect,状态码是302
在app.py里面可以使用return redirect(url_for("book"))
但不要redirect 自己

P10

1.render_template 是渲染模板的
这个模板默认去templates里面找
如果要更改的话:这个方法

2.可以传数据到html里面"**context"
context 是要个字典来的
这样,才html中就可以通过

{{字段的键}}来应用
不过要在render_template 中渲染过去

P11

过滤器的讲解,具体可以去知了的课件里面去看
比如,字符长度 可用 {{username|length}}
|是管道,表示过滤东西

P12

if控制语句的讲解
用{% if age > 18%}
div
最好要使用{% endif %}来结束

for 语句的讲解

    {%for book in books %}
  • book
  • {% endfor%}

P13

模板继承的方法

在base html中 要预留位置给别人用{% block title %}{% endblock %}
子模板要继承base模板的话, 开头要加上 {% extend "base.html" %}

P14

静态文件的加载存放方法
css文件加载方法:

js文件加载方法:

P15

蓝图
将不同功能的API 放在不同页,规整管理
不同页那 用 student_bp = Blueprint("student",name,url_prefix="/student") 生产蓝图
将bp 导入到app.py内。 用 app.register_blueprint(student_bp ) 来注册蓝图
注意,不要忘记了"/"个符号

P16

1.安装mysql数据库 和 DBeaver

P17

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.
可以增加这一句,让系统明确是否跟踪每次的修改

18

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()

19 外键

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()

19 Migrate的用法

from flask_migrage import Migrate
migrate = Migrate(app,db)

划重点,文件名必须是app.py,不然Migrate无法找到文件

flask db init
flask db migrate -m "注释语"
flask db upgrate

20 项目重构

P26 Bootstrap

使用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 框内

27 发送邮件

借助到一个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)这样就可以发送邮件了

28

验证码的提取
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")关闭按钮功能

35

利用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()%}


{{message}}

{%endfor%}

模板继承

<title>{% block title %}{% endblock %}</title>

36怎么从API 上传参数给html


37 钩子函数及上下文处理器

@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 {}

37 退出登录的方法

session.clear()

其他知识1 正则表达式

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 ,需要加 ., 如

input 标签里面要加上form-control 这个类才好看,不然没那么好看

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的缩写。

42

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)
button要加上

才好看!

46

下面这里,知道了一个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()))

标签:filter,Python,app,db,Column,Flask,user,学完,id
来源: https://www.cnblogs.com/evenlwd/p/16528399.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有