Django 天天生鲜项目开发和腾讯云nginx+uwsgi+django部署(redis和fdfs也在同一云机上)

开发过程:

开发环境和配置

  1. OS:windows10
  2. MYSQL56 账号root 密码 mysql
    登录命令:mysql -u root -p
    enterpw:mysql
  3. python3.5 anaconda
  4. 编辑器使用:pycharm导入或者新建工程
    file-setting-projiect-interpreter设置对应的ananconda生成的envs
    file-setting-tool-terminal 设置终端为cmd.exe或者其他shell

新建项目和Django基础了解

  1. 建立工程 django-admin startproject 项目名称 建立app python manage.py startapp
  2. app名称 注册app 关联数据库mysql 默认数据库是sqlite3(很多以.开头的命令 .table .quit )
  3. setting文件里边设置 路由设置 urls文件里设置 python manage.py makemigrations 生成迁移文件
  4. python manage.py migrate 生成对应的数据库表
  5. python manage.py runserver ip:端口(本机默认的话可以省略)直接运行网页
  6. 可以创建超级管理员 登入后台进行管理 python manage.py createsuperuser 创建管理员 注册模型类后才能够在后台显示出来 方便管理

开发过程遇到的坑

  1. 不可以直接删除数据库的表,应该重新修改modles文件再重新生成迁移文件,否则会莫名报错
  2. CSRF 跨站请求伪造 防护原理:csrf_token隐藏域,否则无法访问
  3. sql批量插入出现问题,编码模式有问题
  4. url路径index浏览器(chrom 和火狐会 必应不会)会自动变成index/(其他路径不会)
  5. 验证码字体要去c盘搜,选一个存在的,否则生成不了验证码,如果选用的验证码字体不存在,会报错。

redis安装和主从配置

  1. 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后台发送邮件

  1. Celery和Redis使用时候,升级了django2.2发现与pymysql不兼容。 参考下方
    https://blog.csdn.net/weixin_33127753/article/details/8910055
  2. 邮箱异步处理 首先要开通授权码,利用内置的函数发邮箱 要设置好中间人broker 要配置好处理者worker copy好代码否则启动不了
  3. 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  worker -l info -P eventlet

用户登录页面

  1. 用户中心的页面,需要用装饰器来判断是否已经登入,并且判断重定向登入页面继续跳转,需要使用内置的认证系统
  2. .redis数据库存储历史浏览记录 会比较快速
  3. fastDFS解决了海量存储的文件冗余问题,原理是将文件内容用hash值存储存在唯一映射,根据文件内容映射就不会重复存储
  4. 安装nginx,需要预先要安装对应的3个依赖包zlib pcre openssl
  5. 连接: 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 )
  1. 解压后的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': '[email protected]',
        'maintainer': 'scott yuan',
        'maintainer_email': '[email protected]',
        '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'])],    屏蔽我~
    } 
  1. 完成以上两步,接着安装 pip install mutagen 和 pip install requests ,不然会提示缺少此两个包。最后 python setup.py install ,成功!

图片上传和前端页面静态化

  1. 网站开发的优化 : 页面的静态化,缓存的设置,减少数据库查询。防止DDOS攻击
  2. 修改goods_sku模型类,在后台重新注册后台管理类,上传图片
  3. 搜索需要修改分词方式,增加jieba里边的中文分析 自定义导入模板
  4. 重新生成静态首页模板,在windows下要指定编码 with open(save_path, ‘w’,encoding=“utf-8”) as f:
  5. ajax发起的请求都在后台,浏览器中看不到效果,所以不能直接返回登入页面
  6. 表单提交或者ajax post方法 一定要使用csrf_token ,否则提交失败
  7. 页面提交的时候凡是涉及到价格的数据都不要提交,因为后台要自己查询自己用,否则的话,呵呵呵,老板要倾家荡产了。
  8. 数量的话redis也可以查到
  9. 表单中的checkbox只有被选中时值才会被提交

数据库考虑订单并发的情况

  1. 订单提交的时候,支付的时候都要进行库存的判断,因为存在订单并发的情况
  2. 订单模块采用数据库的事物,
  3. 只要from django.db import transaction 然后采用装饰器
    @transaction.atomic transaction.savepoint()设置保存点
    transaction.savepoint——rollback(id) 恢复保存点
    transaction.savepoint_commit(save_id) 提交事务
  4. 订单并发中的悲观锁和乐观锁 冲突比较少用乐观锁还不影响别人不加锁释放锁 提高性能 重复操作代价太大的时候就用悲观锁吧
  5. 事物的隔离级别 出现幻读 修改mysqld.cnf

支付宝接口的调用

  1. 使用沙箱模拟环境实现支付功能(支付宝开发者中心) appid 2016102400752281 ①pip install python-alipay-sdk --upgrade 一定要更新到最新

  2. 使用inspec模块查看相关类和函数的使用方法,参数和源代码***(app_private_key_path参数不能用,只能使用app_private_key_string)***

  3. 一定要使用app_private_key_string=open(‘app_private_key.pem’,'r','utf-8').read()读取秘钥,否则会出现格式错误(直接复制不行的)

  4. 直接定义长字符串会变成tuple类型

  5. 沙箱账号第一次支付成功,后面会提示钓鱼网站风险 重启才好解决

项目部署到腾讯云的免费云端

  1. 云服务器与开发本机用fstp传送代码和文件安装包等,pycharm自带可以远程连接,编辑完直接同步,很好用。winscp也可以直接发送文件,不过还是建议直接用pycharm自带的Tools–>deployment–>sftp工具。
  2. 云机端的mysql默认密码不知道可以登录系统文件,在mysql数据库里边重置root密码,具体百度就好,不用重装
  3. 云机端安装软件包,编译make 和启动服务的时候很多都需要重新设置权限举例如下 https://blog.csdn.net/weixin_43521165/article/
  4. pip freeze > requirement.txt导出虚拟环境需要的包,pip install -r requirement.txt一次性全部安装
  5. 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
  1. 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)

  1. 腾讯云安装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
  1. 解决方案https://blog.csdn.net/qq_36638599/article/details/79424878
    完美解决https://blog.csdn.net/u010889616/article/details/82867091

  2. nginx访问fdfs分布式系统的时候,nginx的配置文件开头要加user root,不然文件上传成功之后还是无法访问的。

  3. django 数据库在建表时候一定要记得设置编码类型utf-8,否则后续重设要删除再来

  4. 云端运行的话runserver 0.0.0.0:8000 同时ALLOWED_HOSTS = “*”

  5. 腾讯云服务器会禁用邮件发送的端口,需要申请解禁 在后台的安全管控中,选择25端口解封

  6. uwsgi运行的环境问题,因为没有建立虚拟环境。所以要制定python3环境运行

 pip3 install uwsgi 	

运行的时候就要使用

uwsgi_python36 –-ini uwsgi.ini (implicit plugin requested python36) 

配置文件加上:

plugin: python3

		  uwsgi_python36  –-stop uwsgi.pid 停止运行
  1. 后台运行celery nohup celery -A tasks worker -l info -P eventlet & (运行状况,查看nohup.out日志指定运行状况)

  2. uwsgi运行,静态文件的页面错乱不好用(原因是因为静态文件在DEBUG=true时django框架会帮忙处理;false的时候django也不会帮忙处理)所以后续静态文件nginx来处理

  3. 静态页面渲染完成的时候,会出现usr/order 的url路径匹配报错 需要在父模板加上page参数,严格匹配正则表达式

  4. 云服务启动流程

①开启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 & 

你可能感兴趣的:(Django 天天生鲜项目开发和腾讯云nginx+uwsgi+django部署(redis和fdfs也在同一云机上))