讲一讲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目录下创建templatesstatic文件夹,放置模板文件和静态文件,之后需要修改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 %}

模板文件如果需要用到render命令传入的Context,不能放在单引号内,只能用在双引号里面。

复制 # 这个是渲染不出来的,必须要双引号才行
复制
还有些能用到的命令,备忘
  • 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.*)$', serve,{'document_root': settings.STATIC_ROOT})]

大致就这样吧,比起Flask的轻便来,我觉得可能小项目的话还是使用Flask简单粗暴,不过Django的admin页面倒是挺人性化的,能够按需定制这点很好。

你可能感兴趣的:(讲一讲Django开发中遇到的坑)