django myDailyFresh share


一、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>&nbsp;&nbsp;</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"
   .\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
   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;
	       }
      }
	   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)
  • 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
   ./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 
   ./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 # stop
  • celery -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/;
        }
	    ....
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值