虚拟环境 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
virtualenv
import_name
传入 __name__ 即可 __name__ 内置模块,表示当前模块的名字
static_url_path
静态文件的路由,访问路径
默认值:None -> static 默认使用的 static_folder 的值
static_folder
静态文件的目录
默认值: static
template_folder
模板文件的目录
默认-》templates
视图 返回指定的页面
导包
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
多对多 需要一张关系表 维护关系
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
first
符合条件的第一条数据
返回值 对象
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()
课程标签
表名 Label
课程
表名 course
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()
由于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