在Openshift上部署Django时出现500错误
我在按照这个关于在Openshift上部署Django的教程进行操作,链接在这里:https://github.com/rancavil/django-openshift-quickstart/wiki/Tutorial-How-create-an-application-with-Django-1.6-on-Openshift
但是,我遇到了500服务器错误。以下是我的代码:
views.py
# -*- coding: utf-8 -*-
from django.shortcuts import render
from bs4 import BeautifulSoup
from collections import namedtuple
import requests
def results(request):
final_data = []
url ="http://www.15min.lt/cempionatas/futbolas/pasaulio-futbolo-cempionatas-2014?from=fifa-menu"
r = requests.get(url)
soup = BeautifulSoup(r.content)
tables = soup.find_all('table')
for table in tables:
row = table.find_all('tr')
data = [[td.text.strip().encode("utf-8") for td in tr.findAll("td")] for tr in row]
final_data += data
group1 = final_data[:7]
group2 = final_data[7:14]
group3 = final_data[14:21]
group4 = final_data[21:28]
group5 = final_data[28:35]
group6 = final_data[35:42]
group7 = final_data[42:49]
group8 = final_data[49:56]
return render(request, 'results.html', {"group1": group1, "group2": group2, "group3": group3, "group4": group4, "group5": group5,
"group6": group6, "group7": group7, "group8": group8 })
def news(request):
Link = namedtuple('Link', ['title', 'url'], verbose=True)
links = []
url ="http://www.15min.lt/naujienos/sportas/fifa-2014/"
r = requests.get(url)
soup = BeautifulSoup(r.content)
titles = soup.findAll("div", attrs={"class": "vl-article-title"})
for i in titles:
links.append(Link(i.find("h3").find("span").find("a").text, url=i.find("h3").find("span").find("a")["href"]))
return render(request, 'News.html', {"links": links})
def tables(request):
Datas = namedtuple('Datas', 'string url', verbose=True)
url ="http://www.uefa.com/worldcup/season=2014/standings/"
final_data = []
r = requests.get(url)
soup = BeautifulSoup(r.content)
tables = soup.find_all('table')
for table in tables:
row = table.find_all('tr')
data = [[td.text.strip().encode("utf-8") for td in tr.findAll("td")] for tr in row]
head = [[th.text.strip().encode("utf-8") for th in tr.findAll("th")] for tr in row]
for i in data:
if i:
if i[1] == "Netherlands": i.insert(1, Datas(i, "http://img.uefa.com/imgml/flags/18x18/ned.png"))
elif i[1] == "Cameroon": i.insert(1, Datas(i, "http://img.uefa.com/imgml/flags/18x18/cmr.png"))
elif i[1] == "Spain": i.insert(1, Datas(i, "http://img.uefa.com/imgml/flags/18x18/esp.png"))
elif i[1] == "Côte d'Ivoire": i.insert(1, Datas(i, "http://img.uefa.com/imgml/flags/18x18/civ.png"))
elif i[1] == "Japan": i.insert(1, Datas(i, "http://img.uefa.com/imgml/flags/18x18/jpn.png"))
elif i[1] == "Costa Rica": i.insert(1, Datas(i, "http://img.uefa.com/imgml/flags/18x18/crc.png"))
elif i[1] == "Switzerland": i.insert(1, Datas(i, "http://img.uefa.com/imgml/flags/18x18/sui.png"))
elif i[1] == "Bosnia and Herzegovina": i.insert(1, Datas(i, "http://img.uefa.com/imgml/flags/18x18/bih.png"))
elif i[1] == "Iran": i.insert(1, Datas(i, "http://img.uefa.com/imgml/flags/18x18/irn.png"))
elif i[1] == "Nigeria": i.insert(1, Datas(i, "http://img.uefa.com/imgml/flags/18x18/nga.png"))
else:
flag = i[1][:3] + ".png"
i.insert(1, Datas(i, "http://img.uefa.com/imgml/flags/18x18/" + flag))
final_data += data
group1 = final_data[:5]
group2 = final_data[5:10]
group3 = final_data[10:15]
group4 = final_data[15:20]
group5 = final_data[20:25]
group6 = final_data[25:30]
group7 = final_data[30:35]
group8 = final_data[35:40]
return render(request, 'Groups.html', {"group1": group1, "group2": group2, "group3": group3, "group4": group4, "group5": group5,
"group6": group6, "group7": group7, "group8": group8 })
urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^$', 'views.home', name='home'),
url(r'^tvarkarastis/', 'polls.views.results', name='results'),
url(r'^lenteles/', 'polls.views.tables', name='results'),
url(r'^naujienos/', 'polls.views.news', name='naujienos'),
)
在本地一切正常,但在服务器上就出问题了。请问错误出在哪里?如果你需要更多信息,请告诉我。
更新:
settings.py中的调试部分:
if ON_OPENSHIFT:
DEBUG = bool(os.environ.get('DEBUG', False))
if DEBUG:
print("WARNING: The DEBUG environment is set to True.")
else:
DEBUG = True
更新(2):
我在使用virtualenv,并且在里面安装了beautifulsoup4和其他库。以下是我的requirements.txt内容:
Django==1.6
YourAppName==1.0
argparse==1.2.1
beautifulsoup4==4.3.2
requests==2.3.0
wsgiref==0.1.2
尽管如此,我还是遇到了这个错误:
No module named bs4
2 个回答
你可以再检查两个方面:
首先,看看你的 ALLOWED_HOSTS
设置在 settings.py
文件中是什么?当你在生产环境中运行(这意味着 DEBUG
设置为 FALSE
)时,你需要正确设置它,否则每次请求都会出现 HTTP 500
错误。可以在这里查看Django文档。
第二点是,为了方便在生产环境中安装正确的库和包,你应该按照教程中的说明编辑你的 setup.py
文件。你的错误信息显示至少缺少一个模块。
在你的 教程 中已经有一个完整的例子:
# Put here required packages
packages = ['Django<=1.6',]
# This is if you like use redis cloud w/Django...
if 'REDISCLOUD_URL' in os.environ and 'REDISCLOUD_PORT' in os.environ and
'REDISCLOUD_PASSWORD' in os.environ:
packages.append('django-redis-cache')
packages.append('hiredis')
setup(name='YourAppName', # <= Put your application name, in this case 'mysite'
version='1.0',
description='OpenShift App', # <= Put your description if you want
author='Your Name', # <= Your name!!!!
author_email='example@example.com',
url='https://pypi.python.org/pypi',
install_requires=packages,
)
在你推送到openshift仓库后,它会这样处理:
当我们进行推送时,所有任务会自动执行,以安装和配置Django在Openshift上。这会在远程的Openshift上执行 $ python setup.py install。
基本的任务顺序是:
- 安装Django 1.6和
setup.py
文件中install_require
列表里的所有包。- 执行部署脚本(文件位于 mysite/.openshift/action_hook)。
- 执行 python 脚本 secure_db.py(文件位于 mysite/.openshift/action_hook),为管理员用户创建密码。
希望这些对你有帮助!
因为你遇到了一个ImportError
的错误,假设你已经安装了所有需要的东西,这可能是虚拟环境的问题。在使用Openshift时,你应该手动激活这个虚拟环境。简单来说,根目录下的wsgi.py
文件可能包含类似下面的内容:
#!/usr/bin/python
import os
virtenv = os.path.join(os.environ['OPENSHIFT_PYTHON_DIR'], 'virtenv')
virtualenv = os.path.join(virtenv, 'bin', 'activate_this.py')
try:
execfile(virtualenv, dict(__file__=virtualenv))
except IOError:
pass
from yourproject.wsgi import application