首页 > 编程语言 >零基础玩转Python Flask框架-学完可就业 笔记

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

时间:2022-08-30 12:55:47浏览次数:59  
标签: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

[email protected]("/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 = "[email protected]"
MAIL_PASSWORD = "usbrqrxmyrizcagg"
MAIL_DEFAULT_SENDER = "[email protected]"

mail = Mail()
mail.init_app(app) 把app传进去
from flask_mail import Message
message = Message(
subject="测试用邮件",
recipients=["[email protected]","[email protected]"],
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
From: https://www.cnblogs.com/evenlwd/p/16528399.html

相关文章

  • Python 使用wmi获取远程端电脑的磁盘使用情况
    安装wmi包pipinstallwmi说明:执行上面命令会自动安装依赖包pywin32代码演示importjsonasJSONimportreimportparamikoimportsudsfromsuds.wsseimport......
  • Python基础语法知识
    3、python基础语法知识3.1变量1.什么是变量?可以变化的量2.为什么要有变量?程序去执行一种状态,并且是可以变化的1.变量的使用原则:先定义,后使用name='hello'#定义pr......
  • Python基础
    Python1、基础知识1.1编程语言什么是语言?为什么要有编程语言?什么是编程?为什么要编程?编程语言的本质就是一门语言,是人与计算机沟通的一种介质。人与人之间......
  • Python--自动将文件分类归入文件夹
    转载:(63条消息)Python--自动将文件分类归入文件夹_JavaNewMans的博客-CSDN博客_python文件夹分类   ##推荐(63条消息)【python】将不同后缀的文件分开到不同文......
  • python实现常量类
    const有什么好处?最直接的好处是,防止被二次修改导致整个程序崩掉!第一种方法,使用enum来定义变量,防止串改.fromenumimportEnum,unique#若要不能定义相同的成员值......
  • Python使用gdb进行debug的方法
    准备工作:1、必须安装gdb,一般系统默认安装过了,未安装的根据系统使用不同命令安装,比如yuminstallgdb,也可以用rpm命令进行安装2、必须有一个携带符号表的Python,版本与要......
  • python print居中-靠右-靠左输出
    1 居中输出   需要使用center函数使用center函数,需要str类型的数据。width参数:长度,需要填一个int类型的参数fillchar参数:两边填充的字符,需要一个str类型的参数(可以......
  • Python入门系列(五)一篇搞懂python语句
    If语句elif关键字是pythons表示“如果前面的条件不为真,那么试试这个条件”。Theelsekeywordcatchesanythingwhichisn'tcaughtbytheprecedingconditions.a=......
  • [CISCN2019 华北赛区 Day1 Web2]ikun-1|python反序列化
    考点:JWT身份伪造、pythonpickle反序列化、逻辑漏洞1、打开之后首页界面直接看到了提示信息,信息如下:2、那就随便注册一个账号进行登录,然后购买lv6,但是未发现lv6,那就查看......
  • python之面向对象
    面向对象本质:将特定的数据与特定的功能绑定到一起将来只能彼此相互使用对象其实就是一个容器里面将数据和功能绑定到一起使用场景一:​ eg:游戏人物......​ ......