虚拟环境 flask
activate DjangoPath
pip install virtualenv
virtualenv FlaskPath
virtualenv -p python.exe路径 FlaskPath
文件夹\activate.bat
文件夹\deactivate.bat
pip install flask
pip install flask-sqlalchemy
pip install flask-pymysql
pip install flask-restful
pip install flask-script
pip install flask-migrate
python main.py db init 初始化迁移文件 只需执行一次
python main.py db migrate 生成迁移文件
python main.py db upgrade 执行迁移文件
pip install flask-wtf
3,from表单类常用的需要规则
DataRequired 空值校验
email 邮箱格式
EqualTo 校验两个内容是否一样
length 长度
NumberRange 数字范围
AnyOf 指定范围
NoneOf 不在范围
blueprintproject 蓝图目录结构
|- blueprintproject 工程目录
|- Flakspath 虚拟环境
|- main.py 控制文件
|— settings.py 配置文件
|- bluepprintroject 程序包
|— init.py 初始化文件
|- course 子应用
|- init.py 初始化
|- models.py 模型
|- views.py 视图文件
|- user 子应用
|- init.py 初始化
|- models.py 模型
|- views.py 视图文件
flask 项目目录结构
|--Project
|--FlaskPath
|--Project
|-- static
|-- templates
|-- __init__.py
|-- manage.py
|-- views.py
anaconda
- 安装运行 不需要python环境
- 创建虚拟环境 可以指定要使用的python版本
- 沙箱环境很难迁移
- 基于服务器的沙箱环境
- 安装包的,解决依赖关系
virtualenv
- 安装运行 需要python环境
- 需要使用主机上的python环境
- 沙箱环境很容易迁移
- 基于项目的沙箱环境
1. Flask 参数
-
import_name
-
传入 __name__ 即可 __name__ 内置模块,表示当前模块的名字
-
-
static_url_path-
静态文件的路由,访问路径 默认值:None -> static 默认使用的 static_folder 的值
-
-
static_folder-
静态文件的目录 默认值: static
-
-
template_folder-
模板文件的目录 默认-》templates
-
2. run参数
- host 服务启动主机地址
- port 服务启动端口号
- debug True 能够显示报错的详细信息
- True 不会重启项目
- use_reloader=True 自动重启项目
视图 返回指定的页面
-
导包
-
from flask import render_template
-
-
from flask import render_template @app.route("/myindex") def myindx(): ## 返回页面 return render_template("index.html")extends:将公共的内容提取出来,个性的内容增加块,继承然后块内填入
include: 加载页面,将页面内容加载到当前页面
-
优化目录结构
init.py 初始化文件
manage.py 项目控制文件
views.py 视图文件
init.py
from flask import Flask
app = Flask(name)
manage.py-
from lou2.views import app if __name__ == '__main__': app.run(debug=True,use_reloader = True)
-
manage.py
-
from lou2.views import app if __name__ == '__main__': app.run(debug=True,use_reloader = True)
views.py
from flask import render_template
from lou2 import app
@app.route("/index")
def index():
return render_template(“index.html”)
relationship 通过这个字段建立表跟表之间的关系,字段并不存在与数据库中
backref 为产生一个反向映射吧
一对一
在一对多的基础上 增加列表项 uselist = False
多对多
多对多 需要一张关系表 维护关系
- 一个用户有多个课程
- 一个课程有多个用户
3. 单表操作
增加
增加单条 add
c = Course(name="pythonweb",description="pythonweb")
db.session.add(c)
db.session.commit()
## 增加多条 add_all
c1 = Course(name="pythonweb1", description="pythonweb1")
c2 = Course(name="pythonweb2", description="pythonweb2")
db.session.add_all([c1,c2])
db.session.commit()
查询
-
all 返回所有的数据
- 列表
data = Course.query.all()
print (data)
get
- flask中的get只能根据id(主键)进行查询
- 返回对象
- 如果没有 返回 None
- 不会出现多条的情况
first
-
符合条件的第一条数据
- 如果没有数据 返回 None
-
返回值 对象
data = Course.query.get(1)
data = Course.query.get(ident = 1)
data = Course.query.filter(Course.id == 1).all()
data = Course.query.filter_by(id =1).all()
data = Course.query.filter(Course.id == 1).first()
## 升序
data = Course.query.filter(Course.name == "pythonweb").order_by(Course.id).all()
## 降序
data = Course.query.filter(Course.name == "pythonweb").order_by(Course.id.desc()).all()
print(data)
## 分页
# limit 查询多少条
# offset 标识从指定下标开始
data = Course.query.offset(2).limit(2).all()
print (data)
#修改
data = Course.query.get(1) ## 对象
data.name = "hello"
db.session.merge(data)
db.session.commit()
#删除
data = Course.query.get(1) ## 对象
db.session.delete(data)
db.session.commit()
## 开头
user = User.query.filter(User.name.startswith("zhang")).all()
print (user)
## 结束
user = User.query.filter(User.name.endswith("u")).all()
print (user)
user = User.query.filter(User.name.like("%ang%")).all()
key = “ang”
user = User.query.filter(User.name.like("%{}%".format(key))).all()
key = “ang”
user = User.query.filter(User.name.like("%%%s%%" % key)).all()
data = db.session.query(User.password,User.id).filter(User.name == “zhangsan”).all()
from sqlalchemy import func
data = db.session.query(func.sum(User.id),func.count(User.id)).all()
print (int(data[0][0]) + 10)
data = db.session.query(User.name,func.sum(User.id), func.count(User.id)).group_by(User.name).all()
print (data)
data = db.session.query(User.name,Role.r_name).filter(
User.id == 2,Role.id == User.role_id
).all()
print (data)
try:
## 全部执行成功
role = Role(r_name=“测试1”, description=“测试1”)
db.session.add(role)
db.session.flush()
user = User(name=“laowan”, password=“123456”, role_id=role.id)
db.session.add(user)
db.session.commit()
except:
## 回滚
db.session.rollback()
2. 实验楼项目
课程标签
表名 Label
- name 标签的名字 python c/c++
- description 描述
课程
表名 course
- name 课程的名字
- picture图片
- show_number观看人数
- description 介绍
- time_number 课时
- status 状态 0 代表即将上线 1代表上线
- type 类别 1 代表 免费 2 代表 限免 3代表 vip
- label_id 外键
4. 图片上传
diango中 -》 pillow + imagefiled + upload_to + 路径(上传的路径)
flask中 request.files 完成图片的上传,保存
# photo = request.files.get("image")
# mthod = [one for one in dir(photo) if not one.startswith("_")]
# print (mthod)
# # print (photo)
# print (photo.filename) ## 图片的名字
# print(photo.headers) ### 请求头部信息
# print(photo.content_type) ### 文件类型
# print(photo.mimetype) ### 内容类型
# print(photo.mimetype_params) ### 类型参数
### photo.save(path) ## 保存文件
import os
filePath = os.path.join(“img”,photo.filename) ### img/1.jpg
path = os.path.join(STATIC_URL,filePath) ### 文件路径 static/img/1.jpg
## 保存文件到指定的位置 /static/img
photo.save(path)
## 数据库中存 文件路径 img/1.jpg
user = User.query.get(1)
user.picture = filePath
user.update()
4. 登录装饰器
由于flask的路由是使用装饰器进行实现的,多个视图被装饰器装饰之后,函数名均为 inner,出现了不同的路由下面同一个函数的情况,因此报错
解决方法: 在登录装饰器中使用 wraps,保留原函数的名字
import functools
def LoginValid(func):
@functools.wraps(func) ## 保留原函数的名字
def inner(*args,**kwargs):
###从cookie中取数据
username = request.cookies.get(“username”)
print (username)
id = request.cookies.get(“id”)
if username and id:
user = User.query.filter(User.id == id,User.name == username).first()
if user:
return func(*args,**kwargs)
else:
return redirect("/login/")
else:
return redirect("/login/")
return inner
常见错误
1,路由必须以/开头
不然报错 ValueError: urls must start with a leading slash
2,第二个 视图重名导致错误
AssertionError: View function mapping is overwriting an existing endpoint function : index
from flask import Blueprint
from user.view import *
user_b1=Blueprint(‘user’,name)
3,运行后:ImportError: cannot import name ‘user_b1’ #循环导包问题
解决办法:错开就好了
from flask import Blueprint
user_b1=Blueprint(‘user’,name)
from user.view import *
4,ImportError: No module named ‘traceback’ 报错 模块无法找到,因为环境配置问题,导致虚拟环境出问题,模块找不见。我是重新创建了虚拟环境
解决办法:pip install flask-traceback
5,Could not import runpy module
ImportError: No module named ‘runpy’ 报错
解决方法:1,将SQLALCHEMY_DATABASE URI = "mysq L +mysqlc onnector:// root: 111111@loca Lhost/b luep中的+mysqlconnector删除
2,将db = SQLAlchemy(app)移动到 app = Flask(name)下
6,flask默认接受get请求,不接受post请求
报错:405 Method Not Allowed
修改:@app.route(’/视图名/’,mthods=[‘POST’])
7,RuntimeError: The session is unavailable because no secret key was set, Set the secret_key on the application to something unique and secret 原因:session需要加密,需要秘钥,在flask中的配置增加secret_key
app.config[‘SECRET_KEY’]=‘asdfgh’
8,django. core. exceptions. Improper lyConfigured: Error loading MySQLdb module.
Did you install mysqlcl ient?
原因:django默认使用mysqldb作为mysql数据库操作模块,python3默认采用pymysql导致的兼容问题 需要在项目主目录的__init__.py当中编写
解决办法:
import pymysql
pymysql.install_as_MySQLdb()
9,TemplateDoesNotExist at /Buyer/login/
buyer/loging.html
解决方法:
1、当前问题是由于找不到html文件导致的
2、查看settingstemplate配置
3、查看是否有当前名称的文件
10,DoesNotExist at /Buyer/get_ address/
Quser matching query does not exist.
解决办法:
图中错误是由于数据没有获取到造成的,
1、首先确认数据库是否同步
2、其次确认数据库查询条件是否为空
3、再次确认数据库是否有该条数据
11,
E:\flask\project\FlaskPath\lib\site-packages\pymysql\cursors.py:170: Warning: (1366, "Incorrect string value: 未解决 是Mysql3.5.7版本的一个小BUG
本文介绍了Flask Web开发的相关知识,包括虚拟环境的配置,Flask参数如`import_name`和`run`,以及数据库的初始化和迁移。在数据库操作部分,讲解了如何进行单表的增加和查询,如`get`、`all`、`first`等。此外,还提到了登录装饰器的实现,如何处理视图重名和导入错误等问题。
8153

被折叠的 条评论
为什么被折叠?



