文章目录
- 一、create project and app
- 二、create database tables
- 三、create super user
- 四、add apps dir to system path
- 五、allowed hosts
- 六、static files dir setting
- 七、html files dir setting
- 八、set local zone
- 九、set mysql db
- 十、captcha
- 十一、auth setting
- 十二、richText filed
- 十三、introduce redis for cache and session and db
- 十四、encryption user_id in active procedure
- 十五、ImageField
- 十六、username and email login
- 十七、FastDFS
- 十八、run with uWSGI
- 十九、Nginx process static files and transfer request to uWSGI
- 二十、deployment
一、create project and app
django-admin startproject mysite
python manage.py startapp cart
python manage.py startapp goods
python manage.py startapp order
python manage.py startapp user
二、create database tables
python manage.py makemigrations
# create migration file (*.py)python manage.py migrate
# execute sql statements to create tables
三、create super user
python manage.py createsuperuser
四、add apps dir to system path
- settings.py
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
五、allowed hosts
- settings.py
ALLOWED_HOSTS = ['*', ] # allow all ips
六、static files dir setting
mkdir static
# project root path, include js/images/css…- settings.py
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
- *.html
{% load static %}
href="{% static 'css/main.css' %}"
七、html files dir setting
mkdir templates
# project root path, include *.html- settings.py
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
}
八、set local zone
- settings.py
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False # db time field based on local zone
九、set mysql db
pip install pymysql
mysql -u root -p
# password:123456
> create DATABASE myDailyFresh;
- register mysql to system service
mysqld --install # register
net start mysql # start
net stop mysql # stop
- settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myDailyFresh', # db name,
'USER': 'root',
'PASSWORD': '123456',
'HOST': '192.168.1.101', # mysql server ip
'PORT': 3306 # mysql server port
}
}
- myDailyFresh/init.py
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
十、captcha
pip install django-simple-captcha
- settings.py
INSTALLED_APPS = (
...
'captcha',
)
- urls.py
urlpatterns = [
...
path('captcha/', include('captcha.urls')),
]
- user.forms.py
from django import forms
from captcha.fields import CaptchaField
class RegisterForm(forms.Form):
email = forms.EmailField(required=True)
password = forms.CharField(required=True, min_length=6)
captcha = CaptchaField(error_messages={'invalid':'验证码错误'})
- register.html
<div class="form-group marb8 captcha1 ">
<label>验 证 码</label>
{{ register_form.captcha }}
</div>
十一、auth setting
- settings.py
AUTH_USER_MODEL = 'user.User' # use custom db table instead of default table auth_user for authing
十二、richText filed
pip install django-ckeditor
- settings.py
INSTALLED_APPS = (
...
'ckeditor',
)
- *.models.py
from ckeditor.fields import RichTextField
detail = RichTextField(blank=True, verbose_name='goods detail')
十三、introduce redis for cache and session and db
pip install django-redis
- settings.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://192.168.1.102:6379/1", # save cache(key:val data) and session(login data) and db(history, cart)
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
- install redis for windows
https://github.com/microsoftarchive/redis, build solution by visual studio - run redis server
.\redis-server.exe
- run redis client
.\redis-cli.exe # command refer to redis page
- *views.py
con = get_redis_connection('default') # connect remote redis server named 'default'
history_key = 'history_%d'% user.id
sku_ids = con.lrange(history_key, 0, 4) # get list IE data
十四、encryption user_id in active procedure
pip install itsdangerous
- *views.py
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
serializer = Serializer(settings.SECRET_KEY, 3600)
info = {'userid': user.id}
token = serializer.dumps(info)
send_register_active_email.delay(email, uname, token.decode())
serializer = Serializer(settings.SECRET_KEY, 3600)
info = serializer.loads(token)
user_id = info['userid']
十五、ImageField
- settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
- urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('cart/', include('cart.urls')),
path('order/', include('order.urls')),
path('user/', include('user.urls')),
path('', include('goods.urls')),
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
- *models.py
# create 'type' dir in settings.MEDIA_ROOT, 'group1/M00/00/00/wKi3gV6o8TGAb-PoAAA2pLUeB60896.jpg' saved in image filed
image = models.ImageField(upload_to='type', verbose_name='goods type pic')
十六、username and email login
- settings.py
AUTHENTICATION_BACKENDS = (
'user.views.CustomBackend',
)
- user.views.py
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
class CustomBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = User.objects.get(Q(username=username)|Q(email=username))
if user.check_password(password):
return user
except Exception as e:che
return None
十七、FastDFS
- tracker.conf
bind_addr= # empty for bind all addresses of this host
port=22122 # the tracker server port
base_path=/home/wenhchen/fastdfs/tracker # store data and log files
- storage.conf
bind_addr= # empty for bind all addresses of this host
port=23000 # the strorage port, as client connected to tracker
tracker_server=192.168.1.103:22122
base_path=/home/wenhchen/fastdfs/storage # store data and log files
store_path0=/home/wenhchen/fastdfs/storage0 # based 0, if store_path0 not exists, it's value is base_path
store_path1=/home/wenhchen/fastdfs/storage1
store_path_count=2
group_name=group1 # the group name this storage belongs to
- client.conf
- download source from https://github.com/JaceHo/fdfs_client-py
python setup.py install
tracker_server=192.168.1.103:22122
base_path=/home/wenhchen/fastdfs/client # store data and log files
- nginx conf
-
mod_fastdfs.conf
tracker_server=192.168.1.103:22122
-
nginx.conf
-
server {
listen 8888;
server_name 192.168.1.106;
location ~/group[0-9]/ {
ngx_fastdfs_module; # redirect to tracker server
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
- get image
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
class FdfsStorage(Storage):
def _open(self, name, mode='rb'):
pass
def _save(self, name, content):
client = Fdfs_client('utils/fastdfs/client.conf') # include tracker_server=192.168.1.103:22122
res = client.upload_by_buffer(content.read()) # upload file in admin
# {'Group name':'group1',
# 'Status':'Upload successed.',
# 'Remote file_id':'group1/M00/00/00/wKi3gV6o8TGAb-PoAAA2pLUeB60896.jpg',
# 'Uploaded size':'6.0KB',
# 'Local file name':'test',
# 'Storage IP':'192.168.1.104'}
filename = res['Remote file_id'] # saved in db ImageField
return filename
def exists(self, name):
return False
def url(self, name):
return ' http://192.168.1.106:8888/' + name # name: 'group1/M00/00/00/wKi3gV6o8TGAb-PoAAA2pLUeB60896.jpg'
- settings.py
DEFAULT_FILE_STORAGE = 'utils.fastdfs.FdfsStorage' # involve custom storage class when upload file by admin
- *.html
<img src="{{ goods.image.url }}"> # image.url involve FdfsStorage.url method
十八、run with uWSGI
pip install uwsgi
- uwsgi.ini # create in project root dir on two machines
[uwsgi]
socket=192.168.1.107/108:8000 # used for Nginx
# http=192.168.1.107/108:8000 # used for web server, same with python manager.py runserver 192.168.1.107/108:8000
chdir=/home/wenhchen/projects/myDailyFresh # project root dir
wsgi-file=myDailyFresh/wsgi.py # based on project root dir
processes=4
threads=2
master=True
pidfile=uwsgi.pid # master process id
daemonize=uwsgi.log
- uwsgi cmd
uwsgi –-ini uwsgi.ini # start
uwsgi –-stop uwsgi.pid # stop
十九、Nginx process static files and transfer request to uWSGI
- collect static files
- settings.py
STATIC_ROOT = ‘static_root’ # all static files saved dir python manager.py collectstatic
# run in Django machine(192.168.1.107/108)
- settings.py
- cp ‘static_root’ in Django machine(192.168.1.107/108) to ‘/home/wenhchen/www/myDailyFresh/static_root’ in Nginx machine(192.168.1.109)
- nginx.conf
upstream myDailyFresh {
server 192.168.1.107:8000;
server 192.168.1.108:8000;
}
server {
listen 80;
server_name 192.168.1.109; # project home page ip
location / {
include uwsgi_params;
uwsgi_pass myDailyFresh;
}
location /static {
alias /home/wenhchen/www/myDailyFresh/static_root/;
}
....
}
二十、deployment
1. framework
2. images
- centos
# docker pull centos
- python
# docker pull python
- nginx
# docker pull nginx
- mysql
# docker pull mysql
- redis
# docker pull redis
3. container
i. myDailyFresh_mysql
docker run -itd --name myDailyFresh_mysql -e MYSQL_ROOT_PASSWORD=123456 mysql /bin/bash
docker exec -it myDailyFresh_mysql /bin/bash
mysql> create database myDailyFresh
ii. myDailyFresh_redis
docker run -itd --name myDailyFresh_redis redis /bin/bash
docker exec -it myDailyFresh_redis /bin/bash
iii. myDailyFresh_fastDFS_tracker
docker run -itd --name myDailyFresh_fastDFS_tracker centos /bin/bash
docker exec -it myDailyFresh_fastDFS_tracker /bin/bash
./make.sh
./make.sh install
./make.sh
./make.sh install
- tracker.conf
mkdir -p /home/wenhchen/myDailyFresh/fastDFS/tracker
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
vim /etc/fdfs/tracker.conf
base_path=/home/wenhchen/myDailyFresh/fastDFS/tracker
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
iv. myDailyFresh_fastDFS_storage1
docker run -itd --name myDailyFresh_fastDFS_storage1 centos /bin/bash
docker exec -it myDailyFresh_fastDFS_storage1 /bin/bash
mkdir -p /home/wenhchen/software
# save github code for source code install- https://github.com/happyfish100/libfastcommon.git
./make.sh
./make.sh install
./make.sh
./make.sh install
- storage.conf
mkdir -p /home/wenhchen/myDailyFresh/fastDFS/storage
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
vim /etc/fdfs/storage.conf
base_path=/home/wenhchen/myDailyFresh/fastDFS/storage
store_path0=/home/wenhchen/myDailyFresh/fastDFS/storage0
tracker_server=192.168.1.103:22122 # tracker machine ip
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
- nginx
https://github.com/nginx/nginx.git
https://github.com/happyfish100/fastdfs-nginx-module.git
./configure --prefix=/usr/local/nginx/ --add-module=/home/wenhchen/software/fastdfs-nginx-module/src
make
make install
- mod_fastdfs.conf
cp /home/wenhchen/software/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf
vim /etc/fdfs/mod_fastdfs.conf
connect_timeout=10
tracker_server=192.168.1.103:22122 # tracker machine ip
url_have_group_name=true
store_path0=/home/wenhchen/myDailyFresh/fastDFS/storage0
- vim /usr/local/nginx/conf/nginx.conf
server {
listen 8888;
server_name 192.168.1.104; # storage1 local ip
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
....
}
v. myDailyFresh_fastDFS_storage2
docker run -itd --name myDailyFresh_fastDFS_storage2 centos /bin/bash
docker exec -it myDailyFresh_fastDFS_storage2 /bin/bash
vi. myDailyFresh_fastDFS_nginx
docker run -itd --name myDailyFresh_fastDFS_nginx nginx /bin/bash
docker exec -it myDailyFresh_fastDFS_nginx /bin/bash
- vim /usr/local/nginx/conf/nginx.conf
upstream group1 {
server 192.168.1.104:8888; # storage1 nginx ip
server 192.168.1.105:8888; # storage2 nginx ip
}
server {
listen 8888;
server_name 192.168.1.106; # fastDFS home nginx ip
location ~/group[0-9]/ {
proxy_pass http://group1;
}
....
}
vii. myDailyFresh_django1
docker run -itd --name myDailyFresh_django1 -v C:\code\django\myDailyFresh:/home/wenhchen/myDailyFresh python /bin/bash
docker exec -it myDailyFresh_django1 /bin/bash
- pip
pip3 install django
pip3 install pymysql
pip3 install django-ckeditor
pip3 install django-redis
pip3 install celery
pip3 install itsdangerous
pip3 install django-haystack Whoosh Jieba
pip3 install alipay-sdk-python
pip3 install uwsgi
python3 setup.py install # https://github.com/JaceHo/fdfs_client-py
- uwsgi.ini # create file in project root dir
[uwsgi]
socket=192.168.1.107:8000 # used for Nginx
chdir=/home/wenhchen/myDailyFresh # project root dir
wsgi-file=myDailyFresh/wsgi.py # based on project root dir
processes=4
threads=2
master=True
pidfile=uwsgi.pid # master process id
daemonize=uwsgi.log
uwsgi –-ini uwsgi.ini
# start
uwsgi –-stop uwsgi.pid
# stopcelery -A /home/wenhchen/myDailyFresh/celery_tasks.tasks worker --loglevel INFO
viii. myDailyFresh_django2
docker run -itd --name myDailyFresh_django2 -v C:\code\django\myDailyFresh:/home/wenhchen/myDailyFresh python /bin/bash
docker exec -it myDailyFresh_django2 /bin/bash
ix. myDailyFresh_home
docker run -itd --name myDailyFresh_home_nginx -p 80:80 -v C:\code\django\myDailyFresh\static_root:/home/wenhchen/myDailyFresh\static_root nginx /bin/bash
docker exec -it myDailyFresh_home_nginx /bin/bash
- vim /usr/local/nginx/conf/nginx.conf
upstream myDailyFresh {
server 192.168.1.107:8000;
server 192.168.1.108:8000;
}
server {
listen 80;
server_name 192.168.1.109; # project home page ip
location / {
include uwsgi_params;
uwsgi_pass myDailyFresh;
}
location /static {
alias /home/wenhchen/myDailyFresh/static_root/;
}
....
}