开发过程:
开发环境和配置
- OS:windows10
- MYSQL56 账号root 密码 mysql
登录命令:mysql -u root -p
enterpw:mysql - python3.5 anaconda
- 编辑器使用:pycharm导入或者新建工程
file-setting-projiect-interpreter设置对应的ananconda生成的envs
file-setting-tool-terminal 设置终端为cmd.exe或者其他shell
新建项目和Django基础了解
- 建立工程 django-admin startproject 项目名称 建立app python manage.py startapp
- app名称 注册app 关联数据库mysql 默认数据库是sqlite3(很多以.开头的命令 .table .quit )
- setting文件里边设置 路由设置 urls文件里设置 python manage.py makemigrations 生成迁移文件
- python manage.py migrate 生成对应的数据库表
- python manage.py runserver ip:端口(本机默认的话可以省略)直接运行网页
- 可以创建超级管理员 登入后台进行管理 python manage.py createsuperuser 创建管理员 注册模型类后才能够在后台显示出来 方便管理
开发过程遇到的坑
- 不可以直接删除数据库的表,应该重新修改modles文件再重新生成迁移文件,否则会莫名报错
- CSRF 跨站请求伪造 防护原理:csrf_token隐藏域,否则无法访问
- sql批量插入出现问题,编码模式有问题
- url路径index浏览器(chrom 和火狐会 必应不会)会自动变成index/(其他路径不会)
- 验证码字体要去c盘搜,选一个存在的,否则生成不了验证码,如果选用的验证码字体不存在,会报错。
redis安装和主从配置
- redis服务的安装和启动 配置文件 绑定监听的端口 设置命令行非阻塞 有问题要查看日志
配置文件如下:
##192.168.29.18(主)
port 8000 //端口 bind
192.168.18 127.0.0.1 //redis 在 server 上所有有效的网络接口上监听客户端连接,多个IP用空格隔开 daemonize yes
//redis后台运行 pidfile /var/run/redis_8000.pid requirepass root
//设置认证密码
##192.168.29.19(从) port 8001 //端口 bind 192.168.19 127.0.0.1 //redis 在
server 上所有有效的网络接口上监听客户端连接,多个IP用空格隔开 daemonize yes
//redis后台运行 pidfile /var/run/redis_8001.pid slaveof
192.168.29.19 8001 //slaveof 主机ip 端口号 masterauth root //主机认证密码
##192.168.29.18(主) 检查服务是否开启 $ ps -ef | grep redis //redis是否启动成功 $ netstat -tnlp | grep redis //监听redis端口
##主 -p 端口号 -a 主机验证密码 -h 默认为127.0.0.1
##客户端连接命令 $ /usr/local/redis-3.2.8/src/redis-cli -p 8000 -a root
##从机 $ /usr/local/redis-3.2.8/src/redis-cli -p 8001
## 127.0.0.1:8001> info Replication 查看主从连接关系
Celery与redis后台发送邮件
- Celery和Redis使用时候,升级了django2.2发现与pymysql不兼容。 参考下方
https://blog.csdn.net/weixin_33127753/article/details/8910055 - 邮箱异步处理 首先要开通授权码,利用内置的函数发邮箱 要设置好中间人broker 要配置好处理者worker copy好代码否则启动不了
- win10上运行celery4.x就会出现这个问题 ValueError: not enough values to unpack (expected 3, got 0)
解决如下链接: https://blog.csdn.net/qq_30242609/article/details/79047660
pip install eventlet
celery -A <mymodule> worker -l info -P eventlet
用户登录页面
- 用户中心的页面,需要用装饰器来判断是否已经登入,并且判断重定向登入页面继续跳转,需要使用内置的认证系统
- .redis数据库存储历史浏览记录 会比较快速
- fastDFS解决了海量存储的文件冗余问题,原理是将文件内容用hash值存储存在唯一映射,根据文件内容映射就不会重复存储
- 安装nginx,需要预先要安装对应的3个依赖包zlib pcre openssl
- 连接: windows安装fdfs_client-py-master.zip 出现 error: Microsoft Visual C++ 14.0 is required.
1.解压后的fdfs_client-py-master\fdfs_client 目录下的storage_client.py
屏蔽第12行 # from fdfs_client.sendfile import *
文件例子如下
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # filename: storage_cliet.py
4
5 import os, stat
6 import struct
7 import socket
8 import datetime
9 import errno
10 from fdfs_client.fdfs_protol import *
11 from fdfs_client.connection import *
12 # from fdfs_client.sendfile import * 屏蔽我~
13 from fdfs_client.exceptions import (
14 FDFSError,
15 ConnectionError,
16 ResponseError,
17 InvaildResponse,
18 DataError
19 )
-
解压后的fdfs_client-py-master 目录下的setup.py
屏蔽sdict字典中的 `'ext_modules'` 示例如下:
sdict = {
'name': 'fdfs_client-py',
'version': __version__,
'description': 'Python client for Fastdfs ver 4.06',
'long_description': long_description,
'author': 'scott yuan',
'author_email': 'scottzer8@gmail.com',
'maintainer': 'scott yuan',
'maintainer_email': 'scottzer8@gmail.com',
'keywords': ['Fastdfs', 'Distribute File System'],
'license': 'GPLV3',
'packages': ['fdfs_client'],
'classifiers': [
'Development Status :: 1 - Production/Beta',
'Environment :: Console',
'Intended Audience :: Developers',
'License :: GPLV3',
'Operating System :: OS Independent',
'Programming Language :: Python'],
#'ext_modules'[Extension('fdfs_client.sendfile',
# sources=['fdfs_client/sendfilemodule.c'])], 屏蔽我~
}
- 完成以上两步,接着安装 pip install mutagen 和 pip install requests ,不然会提示缺少此两个包。最后 python setup.py install ,成功!
图片上传和前端页面静态化
- 网站开发的优化 : 页面的静态化,缓存的设置,减少数据库查询。防止DDOS攻击
- 修改goods_sku模型类,在后台重新注册后台管理类,上传图片
- 搜索需要修改分词方式,增加jieba里边的中文分析 自定义导入模板
- 重新生成静态首页模板,在windows下要指定编码 with open(save_path, ‘w’,encoding=“utf-8”) as f:
- ajax发起的请求都在后台,浏览器中看不到效果,所以不能直接返回登入页面
- 表单提交或者ajax post方法 一定要使用csrf_token ,否则提交失败
- 页面提交的时候凡是涉及到价格的数据都不要提交,因为后台要自己查询自己用,否则的话,呵呵呵,老板要倾家荡产了。
- 数量的话redis也可以查到
- 表单中的checkbox只有被选中时值才会被提交
数据库考虑订单并发的情况
- 订单提交的时候,支付的时候都要进行库存的判断,因为存在订单并发的情况
- 订单模块采用数据库的事物,
- 只要from django.db import transaction 然后采用装饰器
@transaction.atomic transaction.savepoint()设置保存点
transaction.savepoint——rollback(id) 恢复保存点
transaction.savepoint_commit(save_id) 提交事务 - 订单并发中的悲观锁和乐观锁 冲突比较少用乐观锁还不影响别人不加锁释放锁 提高性能 重复操作代价太大的时候就用悲观锁吧
- 事物的隔离级别 出现幻读 修改mysqld.cnf
支付宝接口的调用
-
使用沙箱模拟环境实现支付功能(支付宝开发者中心) appid 2016102400752281 ①pip install python-alipay-sdk --upgrade 一定要更新到最新
-
使用inspec模块查看相关类和函数的使用方法,参数和源代码***(app_private_key_path参数不能用,只能使用app_private_key_string)***
-
一定要使用
app_private_key_string=open(‘app_private_key.pem’,'r','utf-8').read()
读取秘钥,否则会出现格式错误(直接复制不行的) -
直接定义长字符串会变成tuple类型
-
沙箱账号第一次支付成功,后面会提示钓鱼网站风险 重启才好解决
项目部署到腾讯云的免费云端
- 云服务器与开发本机用fstp传送代码和文件安装包等,pycharm自带可以远程连接,编辑完直接同步,很好用。winscp也可以直接发送文件,不过还是建议直接用pycharm自带的Tools–>deployment–>sftp工具。
- 云机端的mysql默认密码不知道可以登录系统文件,在mysql数据库里边重置root密码,具体百度就好,不用重装
- 云机端安装软件包,编译make 和启动服务的时候很多都需要重新设置权限举例如下 https://blog.csdn.net/weixin_43521165/article/
- pip freeze > requirement.txt导出虚拟环境需要的包,pip install -r requirement.txt一次性全部安装
- fastdfs在腾讯云部署的时候 FDFS终端启动/停止:(自己电脑上开发测试时使用)
sudo service fdfs_trackerd start
sudo service fdfs_trackerd stop
sudoservice fdfs_storaged start
sudo service fdfs_storaged stop
但是云端不能启动,需要直接绝对路径:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
- tracker server ip 不能为 127.0.0.1
解决:修改 /etc/fdfs/storage.conf 中的 tracker_server
. . . .将:tracker_server=127.0.0.1:22122
修改为:tracker_server=xxx.xxx.xxx.xxx:22122(对应自己的ip)
- 腾讯云安装nginx1.8.1会报错
https://ask.csdn.net/questions/860892?sort=id
直接用sudo make 执行还会报错
make[1]: *** [objs/src/core/ngx_murmurhash.o] Error 1
make[1]: Leaving directory '/home/ubuntu/DDSX/nginx-1.8.1'
Makefile:8: recipe for target 'build' failed
make: *** [build] Error 2
-
解决方案https://blog.csdn.net/qq_36638599/article/details/79424878
完美解决https://blog.csdn.net/u010889616/article/details/82867091 -
nginx访问fdfs分布式系统的时候,nginx的配置文件开头要加
user root
,不然文件上传成功之后还是无法访问的。 -
django 数据库在建表时候一定要记得设置编码类型utf-8,否则后续重设要删除再来
-
云端运行的话runserver 0.0.0.0:8000 同时ALLOWED_HOSTS = “*”
-
腾讯云服务器会禁用邮件发送的端口,需要申请解禁 在后台的安全管控中,选择25端口解封
-
uwsgi运行的环境问题,因为没有建立虚拟环境。所以要制定python3环境运行
pip3 install uwsgi
运行的时候就要使用
uwsgi_python36 –-ini uwsgi.ini (implicit plugin requested python36)
配置文件加上:
plugin: python3
uwsgi_python36 –-stop uwsgi.pid 停止运行
-
后台运行celery
nohup celery -A tasks worker -l info -P eventlet &
(运行状况,查看nohup.out日志指定运行状况) -
uwsgi运行,静态文件的页面错乱不好用(原因是因为静态文件在DEBUG=true时django框架会帮忙处理;false的时候django也不会帮忙处理)所以后续静态文件nginx来处理
-
静态页面渲染完成的时候,会出现usr/order 的url路径匹配报错 需要在父模板加上page参数,严格匹配正则表达式
-
云服务启动流程
①开启redis服务
sudo redis-server /etc/redis/redis.conf
②开启fdfs服务
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
③开启uwsgi服务
uwsgi_python36 --ini uwsgi.ini
uwsgi_python36 --ini uwsgi2.ini
④启动nginx
sudo /usr/local/nginx/sbin/nginx
⑤启用后台celery
nohup celery -A tasks worker -l info -P eventlet &