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" %}
暂时没有找到更为优雅的方式,但这种方式也不挨着什么
- Django & webpack & Docker & Apache 实践修正
- docker & django & apache & webpack 实践
- Django & webpack 项目结构实践
- apache+django+mod_wsgi 部署实践
- Django & Docker项目结构实践 2
- webpack人门 & 集成django
- django-webpack配置
- Docker实践
- docker实践
- Docker实践
- webpack实践指南
- webpack基础实践1
- webpack基础实践2
- webpack项目实践
- Webpack入门实践
- scss实践 webpack立方体
- Vue + webpack 项目实践
- Django+Apache
- PYTHON的程序在LINUX后台运行
- fflush不能强制刷新到磁盘
- ThinkPHP框架IndexController中构造函数__construct导致的相关问题
- ios 从URL中截取所包含的参数,并且以字典的形式返回
- 边界不对称性
- Django & webpack & Docker & Apache 实践修正
- 16.11.5
- foo1
- String Task
- js数组的操作
- SpringDataJpa增删改查
- 随机抽样一致性(RANSAC: Random Sample Consensus)
- GitHub for Windows 安装失败,An error occurred attempting to install github 的解决办法
- 如何开始你的第一个android tango AR应用(上)