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 = False
db_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" %}
暂时没有找到更为优雅的方式,但这种方式也不挨着什么