准备环境

  1. 使用 python3 创建虚拟环境
1
python3 -m venv py3venv #创建一个py3venv的虚拟环境
  1. 激活虚拟环境
1
source ./py3venv/bin/activate
  1. 创建项目目录
1
mkdir shop
  1. 为项目 shop 安装依赖
1
cd shop
  1. 安装和卸载包
1
2
pip install flask # 安装包
pip uinstall flask # 卸载包
  1. 退出虚拟环境
1
deactivate: 退出虚拟环境
  1. 初始化环境安装依赖
1
2
pip freeze >requirements.txt #生成全部依赖 requirements.txt用来记录项目所有的依赖包和版本号,只需要一个简单的pip命令就能完成。
pip install -r requirements.txt #安装全部依赖

requirements.txt

1
2
3
4
5
6
7
flask
flask-sqlalchemy
flask-debugtoolbar
mysqlclient
flask_script
requests
uwsgi #Linux部署用,window会无法安装

环境(application.py)

1
export ops_config=base #基本环境
1
export ops_config=local #本地环境
1
export ops_config=production #生产环境

mysql 踩坑

用 vscode 连接 mysql 时出现报错

ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client```
1
2
3
4
5
6
7
8
9
10

### **_node 使用 mysql 报错_**

原因:登录数据库的客户端跟 mysql8.0 不兼容了,mysql8.0 密码认证采用了新的密码格式

解决办法:在系统 mysql 终端输入下面命令

```mysql
//password 是你的数据库账户密码,root和host也是
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

搭建项目目录

  1. 创建项目根目录 shop
1
mkdir shop
  1. 在 shop 目录下创建包 config 用来管理配置文件

通用配置文件config/base_setting.py

1
2
3
4
# -- coding: utf-8 --
SERVER_PORT = 5000
DEBUG = False
SQLALCHEMY_ECHO = False
  1. 本地配置文件

config/local_setting.py

1
2
3
4
5
6
# -- coding: utf-8 --
DEBUG = True
SQLALCHEMY_ECHO = True
SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1/mysql?charset=utf8mb4'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ENCODING = "utf8mb4"
  1. 生产配置文件

config/production_setting.py

1
# -- coding: utf-8 --
  1. 在 shop 目录下创建 application.py 封装 flask 的全局变量

application.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -- coding: utf-8 --
from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy
import os


class Application( Flask ):
def __init__(self,import_name):
super( Application,self ).__init__( import_name )
self.config.from_pyfile( 'config/base_setting.py' )
if "ops_config" in os.environ:
self.config.from_pyfile( 'config/%s_setting.py'%os.environ['ops_config'] )

db.init_app( self )

db = SQLAlchemy()
app = Application( __name__ )
manager = Manager( app )
  1. 在 shop 目录下创建 www.py 封装 HTTP 相关初始化

www.py

1
2
3
4
5
# -- coding: utf-8 --
from application import app
from web.controllers.index import route_index

app.register_blueprint( route_index,url_prefix = "/" )
  1. 在 shop 目录下创建 manager.py 启动入口

manager.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -- coding: utf-8 --
from application import app,manager
from flask_script import Server
import www

##web server
manager.add_command( "runserver", Server( host='0.0.0.0',port=app.config['SERVER_PORT'],use_debugger = True ,use_reloader = True) )

def main():
manager.run()

if __name__ == '__main__':
try:
import sys
sys.exit( main() )
except Exception as e:
import traceback
traceback.print_exc()
  1. 在 shop 目录下创建 readme.md

readme.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Python Flask 商城系统
=====================
##启动
* export ops_config=local|production && python manage.py runserver

##flask-sqlacodegen

flask-sqlacodegen 'mysql://root:password@127.0.0.1/shop_db' --outfile "common/models/model.py" --flask
flask-sqlacodegen 'mysql://root:password@127.0.0.1/shop_db' --tables user --outfile "common/models/user.py" --flask

## 所见即所得编辑器ueditor

<script src="{{ buildStaticUrl('/plugins/ueditor/ueditor.config.js') }}"></script>
<script src="{{ buildStaticUrl('/plugins/ueditor/ueditor.all.min.js') }}"></script>
<script src="{{ buildStaticUrl('/plugins/ueditor/lang/zh-cn/zh-cn.js') }}"></script>


UE.getEditor('editor',{
toolbars: [
[ 'undo', 'redo', '|',
'bold', 'italic', 'underline', 'strikethrough', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertshopedlist', 'insertunshopedlist', 'selectall', '|','rowspacingtop', 'rowspacingbottom', 'lineheight'],
[ 'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|',
'directionalityltr', 'directionalityrtl', 'indent', '|',
'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|',
'link', 'unlink'],
[ 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',
'insertimage', 'insertvideo', '|',
'horizontal', 'spechars','|','inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols' ]

],
enableAutoSave:true,
saveInterval:60000,
elementPathEnabled:false,
zIndex:4,
serverUrl:common_ops.buildUrl( '/upload/ueditor' )
});

##可参考资料
* [python-Flask(jinja2)语法:过滤器](https://www.jianshu.com/p/3127ac233518)
* [SQLAlchemy 各种查询语句写法](https://wxnacy.com/2017/08/14/python-2017-08-14-sqlalchemy-filter/)
  1. 在 shop 目录下创建 requirements.txt

requirements.txt

1
2
3
4
5
6
flask
flask-sqlalchemy
flask-debugtoolbar
mysqlclient
flask_script
requests
  1. 在 shop 目录下创建 common 包 存放公用部分

common/__init__.py

1
# -- coding: utf-8 --

common/libs/__init__.py

1
# -- coding: utf-8 --

common/models/__init__.py

1
# -- coding: utf-8 --
  1. 在 shop 目录下创建 doc 目录 存放存放文档

doc/mysql.md

1
2
数据库变更记录
==================
  1. 在 shop 目录下创建 jobs 包 用来存放一些定时的任务

jobs/__init__.py_

1
# -- coding: utf-8 --

jobs/task/__init__.py_

1
# -- coding: utf-8 --
  1. 在 shop 目录下创建 web 包用来存放蓝图

web/__init__.py

1
# -- coding: utf-8 --

web/controllers/index.py

1
2
3
4
5
6
7
from flask import Blueprint

route_index = Blueprint( 'index_page',__name__ )

@route_index.route("/")
def index():
return 'hello'

web/controllers/__init__.py

1
# -- coding: utf-8 --

简单测试

  1. 在终端添加环境变量
1
export ops_config=local
  1. 启动项目
1
python manage.py runserver
  1. 输入测试 url
1
http://127.0.0.1:5000/