将应用程序添加到托管的 Django 项目
Adding an application to hosted Django project
我已经在网站上倾注了一段时间,但没有找到适合我的解决方案。长期听众,第一次来电。
我有一个现有的 Django 应用程序(基于 Django 文档示例站点,包括 'polls')。我已经把它移了过来,并通过 wsgi 在网络服务器上 运行 运行。
我已经创建了一个包含我自己内容的新本地项目。我这样做的方式类似于示例站点,其中的应用程序与项目的主应用程序处于同一级别。
我现在正在尝试将我创建的应用程序添加到示例站点。当投票应用程序连接到 "mysite".
时,我正在尝试镜像其组织和管道
我的文件结构如下:
- passenger_wsgi.py
- 我的网站
- 我的网站(主应用程序)
__init__.py
- settings.py
- urls.py
- wsgi.py
- 民意调查(示例站点应用程序)
__init__.py
- urls.py
- views.py
- models.py
- 核心(我正在添加的应用程序)
__init__.py
- urls.py
- views.py
- models.py
- manage.py
添加的设置如下所示:
INSTALLED_APPS = {
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
'core'
}
mysite/urls.py:
from django.conf.urls import patterns, include, url
from django.contrib import admin
urlpatterns = patterns('',
url(r'^$', 'polls.views.home', name='home2'),
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
url(r'^core/', include('core.urls', namespace="core")),
)
core/urls.py:
from django.conf.urls import patterns, include, url
from django.contrib import admin
#from core import views
urlpatterns = patterns('',
url(r'^', 'core.views.home', name='home'),
)
当我加载 "manage.py shell" 时,我可以从核心导入 urls、模型和视图。我什至可以使用 django.test.Client 到 "get" "/core/" 并得到包含预期内容的 200 响应。但是,当我尝试在浏览器中导航到该站点(任何 url)时,我得到:"ImportError at No module named urls"
如果我删除包含 core.urls 的调用,其他 url 将按预期工作。
如果对两个 urls.py 文件进行不同的调整,包括直接从顶部 urls.py 调用 core.views 忽略 core.urls,我已经尝试了一些,这导致 "No module named views".
如有任何建议,我们将不胜感激。我也欢迎就如何写出更好的问题提出建议。
编辑:还想提一下,我尝试删除所有已编译的python文件以消除未更新逻辑的可能性。
编辑 2:在 virtualenv 中是 运行。我在 Dreamhost 服务器上安装了更新版本的 Python。
passenger_wsgi.py:
import sys, os
cwd = os.getcwd()
sys.path.append(cwd)
sys.path.append(cwd + '/mysite')
if sys.version < "2.7.9":
os.execl(cwd + "/env/bin/python", "python2.7", *sys.argv)
sys.path.insert(0, cwd + '/env/bin')
sys.path.insert(0, cwd + '/env/lib/python2.7')
sys.path.insert(0, cwd + '/env/lib/python2.7/site-packages/django')
sys.path.insert(0, cwd + '/env/lib/python2.7/site-packages')
os.environ['DJANGO_SETTINGS_MODULE'] = "mysite.settings"
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
mysite/mysite/wsgi.py:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
编辑 3:这是 core/views.py
from django.shortcuts import render
from django.core.mail import send_mail
from django.http import HttpResponseRedirect
# Create your views here.
def home(request):
return render(request, 'core/home.html')
编辑 4:示例 GET header 来自浏览器。导致 500 导入错误;没有名为 urls
的模块
GET /core/ HTTP/1.1
Host: #redacted
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=36HpckIqzOMbw29BOrQWcnaIJbMn6pwo; sessionid=z9c58vb6610kevo4yytolcbhlaqsoqnm
编辑 5:由于回复主要表明事情 看起来 正确,我扩大了问题的范围以包括Dreamhost 并向他们提交了支持票。如果有任何有用的结果,我会在这里报告。
core/urls.py 中的 urlpatterns 看起来不对
而不是做
urlpatterns = patterns('',
url(r'^', views.home, name='home'),)
尝试
urlpatterns = [url(r'^','core.views.home',name='home'),]
P.S。 views.name 被引用
只是预感,但请尝试在 mysite/urls.py.
中将 url(r'^core/', include('core.urls', namespace="core"))
换成 (r'^core/', include('core.urls'))
我终于找到解决办法了。
我尝试创建一个全新的项目并添加 'core' 应用程序,但遇到了完全相同的问题。我突然意识到它无法访问子模块(视图、模型、url)的原因是乘客加载的 'core' 模块不是我加载的 'core' 模块已创建。
我尝试更改应用程序的名称,问题已解决。
我注意到当尝试创建一个名为 'test' 的应用程序时,Django 会向您抛出一条消息,指出由于存在模块而不允许这样做。显然情况并非如此。
为了跟进,我查看了我的 passenger_wsgi.py
文件(也在问题中):
import sys, os
cwd = os.getcwd()
sys.path.append(cwd)
sys.path.append(cwd + '/mysite')
if sys.version < "2.7.9":
os.execl(cwd + "/env/bin/python", "python2.7", *sys.argv)
sys.path.insert(0, cwd + '/env/bin')
sys.path.insert(0, cwd + '/env/lib/python2.7')
sys.path.insert(0, cwd + '/env/lib/python2.7/site-packages/django')
sys.path.insert(0, cwd + '/env/lib/python2.7/site-packages')
os.environ['DJANGO_SETTINGS_MODULE'] = "mysite.settings"
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
回头一看,发现错误。在遵循 DreamHost 的 python 替代版本设置指南(发现 here)时,我将环境的 python 路径插入到 sys.path
的开头。这导致 django.core
模块在附加到 sys.path
.
末尾的我的项目应用程序之前匹配
故事的寓意是注意模块名称和路径构造。
我已经在网站上倾注了一段时间,但没有找到适合我的解决方案。长期听众,第一次来电。
我有一个现有的 Django 应用程序(基于 Django 文档示例站点,包括 'polls')。我已经把它移了过来,并通过 wsgi 在网络服务器上 运行 运行。
我已经创建了一个包含我自己内容的新本地项目。我这样做的方式类似于示例站点,其中的应用程序与项目的主应用程序处于同一级别。
我现在正在尝试将我创建的应用程序添加到示例站点。当投票应用程序连接到 "mysite".
时,我正在尝试镜像其组织和管道我的文件结构如下:
- passenger_wsgi.py
- 我的网站
- 我的网站(主应用程序)
__init__.py
- settings.py
- urls.py
- wsgi.py
- 民意调查(示例站点应用程序)
__init__.py
- urls.py
- views.py
- models.py
- 核心(我正在添加的应用程序)
__init__.py
- urls.py
- views.py
- models.py
- manage.py
- 我的网站(主应用程序)
添加的设置如下所示:
INSTALLED_APPS = {
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
'core'
}
mysite/urls.py:
from django.conf.urls import patterns, include, url
from django.contrib import admin
urlpatterns = patterns('',
url(r'^$', 'polls.views.home', name='home2'),
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
url(r'^core/', include('core.urls', namespace="core")),
)
core/urls.py:
from django.conf.urls import patterns, include, url
from django.contrib import admin
#from core import views
urlpatterns = patterns('',
url(r'^', 'core.views.home', name='home'),
)
当我加载 "manage.py shell" 时,我可以从核心导入 urls、模型和视图。我什至可以使用 django.test.Client 到 "get" "/core/" 并得到包含预期内容的 200 响应。但是,当我尝试在浏览器中导航到该站点(任何 url)时,我得到:"ImportError at No module named urls"
如果我删除包含 core.urls 的调用,其他 url 将按预期工作。
如果对两个 urls.py 文件进行不同的调整,包括直接从顶部 urls.py 调用 core.views 忽略 core.urls,我已经尝试了一些,这导致 "No module named views".
如有任何建议,我们将不胜感激。我也欢迎就如何写出更好的问题提出建议。
编辑:还想提一下,我尝试删除所有已编译的python文件以消除未更新逻辑的可能性。
编辑 2:在 virtualenv 中是 运行。我在 Dreamhost 服务器上安装了更新版本的 Python。
passenger_wsgi.py:
import sys, os
cwd = os.getcwd()
sys.path.append(cwd)
sys.path.append(cwd + '/mysite')
if sys.version < "2.7.9":
os.execl(cwd + "/env/bin/python", "python2.7", *sys.argv)
sys.path.insert(0, cwd + '/env/bin')
sys.path.insert(0, cwd + '/env/lib/python2.7')
sys.path.insert(0, cwd + '/env/lib/python2.7/site-packages/django')
sys.path.insert(0, cwd + '/env/lib/python2.7/site-packages')
os.environ['DJANGO_SETTINGS_MODULE'] = "mysite.settings"
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
mysite/mysite/wsgi.py:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
编辑 3:这是 core/views.py
from django.shortcuts import render
from django.core.mail import send_mail
from django.http import HttpResponseRedirect
# Create your views here.
def home(request):
return render(request, 'core/home.html')
编辑 4:示例 GET header 来自浏览器。导致 500 导入错误;没有名为 urls
的模块GET /core/ HTTP/1.1
Host: #redacted
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=36HpckIqzOMbw29BOrQWcnaIJbMn6pwo; sessionid=z9c58vb6610kevo4yytolcbhlaqsoqnm
编辑 5:由于回复主要表明事情 看起来 正确,我扩大了问题的范围以包括Dreamhost 并向他们提交了支持票。如果有任何有用的结果,我会在这里报告。
core/urls.py 中的 urlpatterns 看起来不对 而不是做
urlpatterns = patterns('',
url(r'^', views.home, name='home'),)
尝试
urlpatterns = [url(r'^','core.views.home',name='home'),]
P.S。 views.name 被引用
只是预感,但请尝试在 mysite/urls.py.
中将url(r'^core/', include('core.urls', namespace="core"))
换成 (r'^core/', include('core.urls'))
我终于找到解决办法了。
我尝试创建一个全新的项目并添加 'core' 应用程序,但遇到了完全相同的问题。我突然意识到它无法访问子模块(视图、模型、url)的原因是乘客加载的 'core' 模块不是我加载的 'core' 模块已创建。
我尝试更改应用程序的名称,问题已解决。
我注意到当尝试创建一个名为 'test' 的应用程序时,Django 会向您抛出一条消息,指出由于存在模块而不允许这样做。显然情况并非如此。
为了跟进,我查看了我的 passenger_wsgi.py
文件(也在问题中):
import sys, os
cwd = os.getcwd()
sys.path.append(cwd)
sys.path.append(cwd + '/mysite')
if sys.version < "2.7.9":
os.execl(cwd + "/env/bin/python", "python2.7", *sys.argv)
sys.path.insert(0, cwd + '/env/bin')
sys.path.insert(0, cwd + '/env/lib/python2.7')
sys.path.insert(0, cwd + '/env/lib/python2.7/site-packages/django')
sys.path.insert(0, cwd + '/env/lib/python2.7/site-packages')
os.environ['DJANGO_SETTINGS_MODULE'] = "mysite.settings"
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
回头一看,发现错误。在遵循 DreamHost 的 python 替代版本设置指南(发现 here)时,我将环境的 python 路径插入到 sys.path
的开头。这导致 django.core
模块在附加到 sys.path
.
故事的寓意是注意模块名称和路径构造。