flask

虚拟环境 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 自动重启项目

视图 返回指定的页面

  1. 导包

    1. from flask import render_template
      
  2. from flask import render_template
    @app.route("/myindex")
    def myindx():
        ## 返回页面
        return render_template("index.html")
    

    extends:将公共的内容提取出来,个性的内容增加块,继承然后块内填入

    include: 加载页面,将页面内容加载到当前页面

  3. 优化目录结构

    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

你可能感兴趣的:(回忆系列)