Django & webpack & Docker & Apache 实践修正

来源:互联网 发布:苹果怎么连不上4g网络 编辑:程序博客网 时间:2024/05/17 00:18

1. 静态文件路径

首先来说一下再django+apache中静态文件是如何被使用的:

a. django

在 Django的setting.py中有一个STATIC_URL, 这个变量会被模板使用到

{% load staticfiles %}<link rel="stylesheet" type="text/css" href="{% static 'common/bootstrap/css/bootstrap.min.css' %}">


假如你的STATIC_URL = ‘/test/’的话,那么最后在html上的会是/test/common/bootstrap/css/bootstrap.min.css


那么 STATICFILES_DIRS /STATICFILES_FINDES呢?

在manage.py中有一个功能是collectstatic,当使用这个命令后会将静态文件全部收集到一个文件夹中,但在manage.py runserver中却自动帮你省去了这一步。

也就是说正常的情况应该是将全部静态文件收集到一个指定的地方,然后告诉django这个指定的地方是什么,之后在模板中使用 static命令来生成html。


如果使用webpack就可以省去collectstatic,因为我们使用webpack将全部静态文件打包到了指定地方

如果你使用django_compressor,也是一样的,manage.py compress做了类似的事情


b. apache

那么这个指定的地方是怎么来的呢?我们来看看apache的配置

Alias /mysite/static/ /path/to/static/<Directory /path/to/static/>Require all granted</Directory>


apache的VirtualHost允许以Alias的方式来进行文件访问,也就是说我们可以在这里让某一条URL指向一个静态文件,之后将这个URL告诉django。

按照这点,我们的server也可以配置在不同的地方,只要能够以某种方式来配置django(例如环境变量)


2. URL & 子域名

a. Django

也是从django说起,从构建脚手架工程我们就可以发现,django中有project和app两个概念,一个project可以含有多个project。

按照正常的套路,当然是一个project拥有一个域名,其下的app拥有不同的子域名。事实上,这也是最合理的。

django的url可以帮助我们实现这一老土的套路:


从setting.py中我们可以找到一个ROOT_URLCONF的选项,他指向了一个模块,也就是说project的根URL配置将会从这里获取,所以可以使用以下方式

setting.py:

ROOT_URLCONF = 'ProjectName.urls'


ProjectName.urls.py:

urlpatterns = [    url(r'^sub1/', include('subapp1.urls')),    url(r'^sub2/', include('subapp2.urls')),]


subapp1.urls.py:

urlpatterns = [    url(r'^view1/', subapp1.view.view1),    url(r'^view2/', subapp1.view.view1),]


在上述配置中

/sub1/view1/  就会指向subapp1.view.view1方法所渲染的template了

我们就可以用这种方式来规划我们的app url了。


b. apache

当然了你也许会有特殊的需求,一个Project是属于一个子域名的(最上层域名是若干Project的集合),这个时候我们可以借助服务器的力量

WSGIScriptAlias /project /path/to/wsgi.py


这条配置就可以让你的django project在一个子域名下,上面的view1就会变成

/project/sub1/view1了


当然你的JS可能需要/project,和静态文件一样的套路,配置

window.globalConfig={    'root':'{{ BASE_URL_PATH }}',     'staticRoot':'{{ BASE_URL_PATH }}/static/'}


这样不失为一种折中的方式


3. models

实际上像model 、middleware这种东西我们可以集中管理,比如放到一个统一的模块core,但在django中的model必须要属于一个app,

于是有两种方式:

a. 将core作为一个django的app,设置到INSTALLED_APPS中

b.为models添加app_label,让django能够识别它为哪个app服务

class Meta:managed = Falsedb_table = 'MY_TABLE'app_label = 'sub1'



4. template

最为雅观的方式应该是将模块的前后端代码放置在一起,特别是对单页面应用而言

-api-api.py-app-main.js-main.css-main.html-view-view.py


例如上述的文件夹结构,但有一个问题是我们可能会有多个单页面应用,也会有多个app,我们需要让django知道模块到底在什么地方,

一个折中的方案是

TEMPLATES = [    {        'BACKEND': 'django.template.backends.django.DjangoTemplates',        'DIRS': [BASE_DIR],        'APP_DIRS': True,        'OPTIONS': {            'context_processors': [                'django.template.context_processors.debug',                'django.template.context_processors.request',                'django.contrib.auth.context_processors.auth',                'django.contrib.messages.context_processors.messages',            ],        },    },]


我们直接将template的DIRS设置为根目录,

但我们也只能被迫这样来写template path

{% extends "your/app/base.html" %}


暂时没有找到更为优雅的方式,但这种方式也不挨着什么

0 0
原创粉丝点击