Flask.1
Flask 中的MVC与MTV
MVC:
Model:负责和数据交互
View (==Template):负责数据展示
Controller(==Views):控制器,接受用户输入,调用数据Model,展示数据
MTV:
Model、Template、view
Flask启动参数:
host:指定运行在哪些IP上,允许谁访问
debug:调试模式,代码修改后,服务器会自定重启
port:端口,默认5000
threaded:开启多线程模式,提升性能
项目结构:
static:可以直接被外部访问
templates:模版,必须在python代码中进行渲染
Python程序文件
route:
路由,获取路径参数
<>声明参数(类型:参数名。 例:<int:id>)
在视图函数中书写和生命的参数对应的参数
Http:
2xx:请求成功
3xx:重定向
4xx:客户端错误
5xx:服务器错误
app = Flask(__name__) @app.route('/') def hello(): return render_template('index.html')#渲染index.html模版
启动服务器
app.run(debug=True)
模版渲染
变量{ { var } }
标签{ % tag % }
block
extends : 继承,扩展。子模块可以填充父类中的块,没有填充的块会被自动优化掉
block + extends(更推荐):实现化整为零
特性:
extends继承:父模版没有要求
block:
首次出现的block,代表一种规划
第二次出现的block,代表规划的填充
第三次出现的block,代表对规划的填充,默认会覆盖第二次的填充,获取父模版中的内容实用 { { super() } }
include:将其他html包含到自己的页面中,体现的一种由零聚一的思维
宏定义:marco
{% macro haha() %} <h1>你哈哈个啥</h1> {% endmacro %} {{ haha() }} #调用
#在html文件中清空所有,直接写下面代码,对应的块覆盖或继承 {% extends 'base.html' %} {% block header %}
<h1>模板挺有意思哈</h1> {% endblock %}
{% extends 'home.html' %} {% block header %} {{ super() }} #继承,不会覆盖 <h2>你胡汉三又回来啦</h2> {% endblock %}
for
if
-
-
{% if exp %}...{% endif %}
-
{% else %}
-
{% elif exp %}
{% for hobby in hobbies %} {% if loop.first %} <li style="color: red">{{ hobby }}</li> {% elif loop.last %} <li style="color: green">{{ hobby|upper }}</li> {% else %} <li>{{ hobby|reverse }}</li> {% endif %} {% endfor %}
ORM
-
-
对象关系映射
-
-
将数据库转换为面向对象的操作
-
通过操作对象就可以实现数据的增删改查
-
如何理解ORM
-
ORM就是一个翻译机
-
-
优点
-
开发效率高
-
可以对接多种数据库(移植性高)
-
易于理解,便于维护
-
将数据转换为面向对象编程
-
-
实现了防SQL注入
-
-
缺点
-
执行效率低
-
因为需要将对象的操作转换为数据库的SQL
-
-
对于复杂操作可能没有支持
模型
-
-
无非就是增删改查
-
存储
-
创建一个对象
-
通过db.session.add
-
最后记得commit
-
-
删除
-
修改
-
查询
-
类名.query.操作
-
all 拿所有 默认返回是 list
-
filter() 过滤
-
过滤条件
-
类名.属性名 操作符 值
-
类名.属性名.操作符 值
-
-
返回BaseQuery
-
可以继续all
-
-
-
get(主键)
# 过滤 student_list = Student.query.filter(Student.score > 80).all() student_list = Student.query.filter(Student.score > 60).filter(Student.score < 80).all() student_list = Student.query.filter(Student.score.__lt__(60)).all() student_list = Student.query.filter(Student.score.in_([60, 81, 100, 200])).all() # order_by必须放在最前面 limit 和 offset无顺序 实际上都是先 offset再limit student_list = Student.query.order_by("score").limit(4).offset(3).all() # offset 为偏移查询 即跳过多少个再输出,limit为显示几个
# 创建数据库,sqlite可以不用有库,执行代码后自动创建text库 app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///test.sqlite" db = SQLAlchemy(app) # 创建数据库表 class Student(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(32), unique=True) score = db.Column(db.Integer, default=60) # 输入路由执行,成功创建User表 @app.route("/init/") def init(): db.create_all() return "初始化成功" # 输入路由后向表里添加数据 @app.route("/addstudent/") def add_student(): student = Student(name="小明%d" % random.randrange(10000), score=random.randrange(100)) db.session.add(student) db.session.commit() # 向数据库提交,这一步必须有 return "添加成功
模型过滤
-
-
BaseQuery可以链式调用
-
Student.query.filter(xxx).filter().filter().filter() #不加.all() 返回的就是BaseQuery对象,加上.all()后返回的是列表,可以通过下标啊取值
Cookie和Session
# 存 cookie response.set_cookie("username", "zbc") #储存username=“zbc”的用户,key-value # 获取cookie username = request.cookies.get("username") # 干掉cooike response.delete_cookie("username")
# 存 session session["username"] = "zbc" # 取 session username = session.get("username") # 干掉session session.pop("username") del session["username"] session["username"] = None # 持久化 session session.permanent = True # True 默认值为31天, False默认值为关闭网页 session.permanent_session_lifetime = timedelta(days=7)