讲一讲Django开发中遇到的坑
记录下用Django从开发环境到生产环境过程中遇到的问题和坑,分享给大家,也好做个备忘。查看原文
Django
Django是Python的web框架中用户最多、交流最多和文档最为齐全(以英文文档为主)的一个框架,让我忍不住去学习,于是撸了一个短链接平台。
在线demo:https://www.0ooo0.cn
Github地址:https://github.com/ioiogoo/SmartUrl
以下按照实际开发中的顺序介绍:
开发环境
创建一个Django项目django-admin startproject mysite
,这个没问题,但是需要注意的是后面还会创建项目的app,分清楚项目和app的区别,一个项目中可以包含很多app。
然后创建一个apppython manage.py startapp app
,创建好后,在app目录下创建templates
和static
文件夹,放置模板文件和静态文件,之后需要修改setting中的INSTALLED_APPS
,TEMPLATES
,STATIC_URL
项目,根据需要修改DATABASES
参数。如果需要显示中国时间的话,还需要修改时间参数,如下:
# some default setting
INSTALLED_APPS = [.......,
'your app name'
]
TEMPLATES = [......,
'DIRS': [os.path.join(BASE_DIR, '/appname/templates/')],
.......
]
STATIC_URL = '/static/'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
配置文件修改好之后,urls.py写路由规则,views.py写逻辑代码,models.py中定义数据模型,接下来就是按照写好的数据模型创建数据库。
python manage.py makemigrations app
创建app的迁移文件
python manage.py sqlmigrate app 0001
查看迁移文件的sql命令
python manage.py migrate
执行迁移命令
templates目录下放入模板文件,如果需要引用静态文件,如下:
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static '/index.css' %}">
模板文件如果需要用到render命令传入的Context,不能放在单引号内,只能用在双引号里面。
<a class='btn btn-primary btn-copy' data-clipboard-text='{{param}}'>复制</a> # 这个是渲染不出来的,必须要双引号才行
<a class='btn btn-primary btn-copy' data-clipboard-text="{{param}}">复制</a>
还有些能用到的命令,备忘
-
python manage.py createsuperuser
创建管理员帐号密码 -
manage.py check --deploy
检查代码 python manage.py runserver --insecure
生产环境
部署到生产环境中遇到的坑大部分都是引用静态文件带来的,setting设置里面debug设为False, 需要设置ALLOWED_HOSTS
,不然运行不了的。还需要设置STATIC_ROOT = os.path.join(BASE_DIR, 'static')
然后执行python manage.py collectstatic
将静态文件全部复制到根目录下static里。
Gunicorn + Nginx + Django 部署
Nginx需要静态文件的反向代理,其他设置跟Flask需要设置的一样
location /static {
alias /path/to/static/;
}
Gunicorn也差不多的设置,新建一个gunicorn.conf文件
bind = "127.0.0.1:5000"
workers = 3
backlog = 2048
worker_class = "gevent"
proc_name = "gunicorn.pid"
pidfile = "/tmp/gunicorn.pid"
accesslog = "/log/path/"
loglevel = "debug"
daemon = True
gunicorn -c gunicorn.conf yourproject.wsgi:application
跑起来
Django DEBUG=False时静态文件404的问题
设置urls.py
from django.views.static import serve
from django.conf import settings
if not settings.DEBUG:
urlpatterns += [url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT})]
大致就这样吧,比起Flask的轻便来,我觉得可能小项目的话还是使用Flask简单粗暴,不过Django的admin页面倒是挺人性化的,能够按需定制这点很好。