应用基本结构使用(安装与使用)
1.安装虚拟环境python -m venv venv
2.激活虚拟环境:.\venv\Scripts\activate
出错就用该命令: set-ExecutionPolicy RemoteSigned
3.安装flask ,其命令:pip install flask
4.在根目录创建app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>hello world!</h1>'
5. flask run 运行该文件
6.结束:deactivate -退出虚拟环境
————————————————
编程的方式运行py文件的方法:
程序的最后加上以下代码:
if__name__'__main__':
app.run(debug=True,host='0.0.0.0',port=8090)
其中,debug代表吊事模式,host代表服务器主机IP,post代表服务器端口号,可选
运行方法为,终端输入python 文件名.py +回车
————————————————————
Python-dotenv
用python-dotenv管理环境变量
1.装包:pip install python-dotenv
2.根目录创建名为.laskenv的文件
3.设置环境变量的值,例如
FLASK_APP='hello.py'
FLASK_RUN_HOST='0.0.0.0'
FLASK_RUN_PORT='8090'
FLASK_DEBUG='True'
#FLASK_ENV='development' flask2.3版本取消
pipenv环境下使用python-dotenv管理环境变量
pip install python-dotenv安装python-dotenv
.env用来包含敏感信息的环境变量,如Email服务器账号密码
.flaskenv用来存储和Flask相关的公开环境变量,如FLASK_AP
路由映射关系
url_for()函数 ——反转函数
————————————————————————————————
模板
继承语法{% extends "模板名称" %}
块的概念
-父模块
-{% block 块的名称%}
-{% endblock %}
模板渲染4个步骤:
- 在根目录下,创建templates文件
- 在templates目录下,准备一个或多个html文件
- 导入render_template包
- 通过render_template('index.html')实现模板的渲染
模板中的可控制语句——if语句(写在网页文件)
{%if 条件%}
{%else%}
{%endif%}
模板中的控制语句——for语句
for 目标 in 对象:
-循环体
{% for 目标 in 对象 %}
<p></p>
模板
模板的继承语法:
{% extends "模板名称" %}
块的概念
-父模块
{% block 块的名称 %}
{% endblock %}
-子模块
{% block 块的名称 %}
子模块中的代码
bootstrap
使用Flask-Bootstrap集成Bootstrap
Bootstrap是Twitter开发的一个开源Web框架,提供用户界面组件可用于创建整洁切具有吸引力的网页,兼容所有现代的桌面和移动平台Web浏览器
- Bootstrap是客户端框架,不会直接涉及服务器。
- 服务器提供引用Bootstrap层叠样式表(CSS,cascading style sheet)和JavaScript文件的响应,并在HTML、CSS和JavaScript代码中实例化所需的用户界面元素。这些操作最理想的执行场所就是模板。
flask-bootstrap
-pip install flask-bootstrap 安装包安装
from flask_bootstrap import Bootstrap 导入包
-bootstrap = Bootstrap(app)
-将应用实例作为参数传递给架构造函数,再用中使用一个包含所有Bootstrap
文件和一般结构的模板
{{}} 里边放变量名称
—————————————————————————————————————————
{% extends'bootstrap/base.html' %} 引入基模板(用于修改标题)
{% block title %}Flask{% endblock %} 标题块
{% block navbar %} 导航快
{% block content %} 主体内容块
{% extends 'base.html' %}
模板
{% block page_content %}
<p>系统异常</p>
{% endblock %}
{% block title %}
{% endblock %}
https://v5.bootcss.com/
中文文档
https://v5.bootcss.com/docs/5.1/getting-started/introduction/
下载
https://v5.bootcss.com/docs/5.1/getting-started/download/
Session的基本配置
Session的基本使用
- 设置Session主要是通过session['name']='value'来完成,name代表的是变量名称,value代表的是变量的值
- 获取Session的值
result=session['name']: 如果内容不存在将会报错
result=session.get('name'): 如果内容不存在,将返回None
- 删除Session的值或清空Session所有值
删除单个Session的值,可以使用Session.pp('key')这个方法,如果清除多个Session的值,可以使用Session.clear方法
- 设置Session的过期时间
未设置则默认为关闭浏览器失效。session.perment=True可在flask下有效时长一个月
定义收藏夹图标
<link rel="icon" href="{{url_for('static',filename='favicon.ico')}}">
数据库
安装与使用
安装包:pip install flask-sqlalchemy
导包:import flask_sqlalchemy import SQLAlchemy
实例化: db=SQLAlchemy(app)
db对象是SQLAchemy类的实例,表示应用使用的数据库。
配置数据库:
basedir=os.path.abspath(os.path.dirname(__file__)) #获取当前项目的位置
app.config['SQLALCHEMY_DATABASE_URI']='sqlit:///'+os.path.join(basedir, 'data.sqlite') #用拼接的方式,生成数据库的地址
app.config['SQLALCHEMY_TRACK_MODIFICATTIONS']=False
db=SQLAlchemy(app)
进入:flask shell
退出:exit()
以类的方式建表:
定义模型
类变量__tablename__定义在数据库中使用的表名。
db.Column类构造函数的第一个参数是数据库列和模型的类型
(db.Column定义)
类型名 | Python类型 | 说明 |
Integer | int | 普通整数,通常为32位 |
|
|
|
实例化:
db=SQLAlchemy(app)
#定义模型
class Role(db.Model):
__tablename__='roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
def __repr__(self):
return '<Role %r>' % self.name
class User(db.Model):
__tablename__='users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
def __repr__(self):
return '<User %r>' % self.username
创建:db.create_all()
赋值:admin_role = Role(name='Admin')
写入:db.session.add(admin_role)
提交:db.session.commit()
查看:print(admin_role.id)
数据库操作
>>> from app import db
>>> db.create_all()
>>> from app import Role,User
>>> admin_role=Role(name='Admin')
>>> mod_role=Role(name='Moderator')
>>> user_role=Role(name='User')
>>> user_join=User(username='john',role=admin_role)
>>> user_susan=User(username='susan',role=user_role)
>>> user_david=User(username='david',role=user_role)
>>> db.session.add(admin_role)
>>> db.session.add(mod_role)
>>> db.session.add(user_role)
>>> db.session.add(user_join)
>>> db.session.add(user_susan)
>>> db.session.add(user_david)
输出ID
>>> db.session.commit()
>>> print(admin_role.id)
1
>>> print(mod_role.id)
2
>>> print(user_role.id)
3
>>>
修改:
>>> admin_role.name='Administrator'
>>> db.session.add(admin_role)
>>> db.session.commit()
>>> print(admin_role)
<Role 'Administrator'>
删除
>>> db.session.delete(mod_role)
>>> db.session.commit()
>>> print(mod_role)
<Role 'Moderator'>
>>> db.session.delete(mod_role)
>>> db.session.commit()
<console>:1: SAWarning: DELETE statement on table 'roles' expected to delete 1 row(s); 0 were matched. Please
set confirm_deleted_rows=False within the mapper configuration to prevent this warning.
查询:
>>> Role.query.all()
[<Role 'Administrator'>, <Role 'User'>]
>>> User.query.all()
[<User 'john'>, <User 'susan'>, <User 'david'>]
>>> User.query.filter_by(role=user_role).all()
[<User 'susan'>, <User 'david'>]
查看sql语句
>>> str(User.query.filter_by(role=user_role))
'SELECT users.id AS users_id, users.username AS users_username, users.role_id AS users_role_id \nFROM users \nWHERE ? = users.role_id'
退出之后:
>>> exit()
PS D:\2022年秋季学期\pythonweb应用开发\10\flask_SQL> flask shell
Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)] on win32
App: app [production]
>>> from app import db
>>> from app import Role,User
>>> user_role=Role.query.filter_by(name='User').first()
>>> print(user_role)
<Role 'User'>
>>>
>>> users=user_role.users
>>> users
[<User 'susan'>, <User 'david'>]
>>> users[0].role
<Role 'User'>
生成需求文件 pip freeze >requirements
pip install -r requirments.txt
- 数据库使用步骤:
(1)装包: pip install flask-sqlalchemy
(2)导包:from flask_sqlalchemy import SQLAlchemy
(3)数据库的配置:
basedir=os.path.abspath(os.path.dirname(__file__)) #获取当前项目的位置
#数据库的配置
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///'+os.path.join(basedir, 'data.sqlite') #用拼接的方式,生成数据库的地址
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
(4)实例化:db=SQLAlchemy(app)
(5)定义表的模型
#定义模型
class Role(db.Model):
__tablename__='roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
def __repr__(self):
return '<Role %r>' % self.name
class User(db.Model):
__tablename__='users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
def __repr__(self):
return '<User %r>' % self.username
(6)建库建表
@app.route('/')
def index():
db.create_all()# 建库建表
admin_rol = Role(name='Admin')#赋值
db.session.add(admin_rol)#2 add()方法添加
db.session.commit() #3 commit()提交
# 查询结果
aaa=Role.query.all()
print(aaa)
return 'app'
- 数据库的增、删、改、查
新的路由和视图函数去完成
(1)添加数据:3个步骤:
准备数据——session.add()添加
session.commit()提交
(2)数据查询:query.all()/first()
使用query.first/all(查询的条件)方法找到相应的对象(记录),然后就可以输出。
.all()所有的 .first()第一条
(3)修改数据的方法:add()方法--commit()
数据修改必须使用query.filter()方法查找到相应对象(记录),
然后使用再对该对象的属性值进行修改。
(4)删除操作:delete()方法--commit()
数据删除必须使用query.filter()方法查找到相应对象(记录),
然后使用db.session.delete(对象名)方法进行删除。
课本53页
db.session.add(admi_role)
db.session.delete(mod_role)
不管修改还是删除,都需要db.session.commit()提交
数据库实体间有3种关联关系:一对一、一对多、多对多。
删除弹窗
@app.route('/delete/<int:movie_id>',methods=['POST']) #动态路由,加支持POST方法
def delete(movie_id):
movie=Movie.query.get_or_404(movie_id) # 删除的id值用变量来做决定
# 对象怎么定?movie是谁? 删除的id值用变量来做决定
db.session.delete(movie)
db.session.commit()
return redirect(url_for('index'))
<form action="">
<input type="submit" value="删除" class="btn btn-outline-danger"
οnclick="return confirm('你确定要删除吗?')">
</form>
--------------------------------------------
Flask-Migrate数据迁移
8个步骤:
- 装包 pip install flask-migrate
- 导包 from flask-migrate import Migrate
- 实例化(位置) migrate=Migrate(app,db) 注: 放在app与db中间
- 创建migrations文件夹,做准备
在终端输入flask db init命令
注:这个命令会创建migrations目录(文件夹),所有迁移脚本都存放在这里
5.修改模型
6.创建迁移脚本
flask db migrate
7.调整
8.迁移应用到数据库
flask db upgrade / flask db stamp
--------------------------------------------------------------------------------------------------------
先分享到这里吧,可能不是很好看,找个时间我详细划分,整好看点
第一次发博客,有点紧张