【问题标题】:Django deployed on Openshift error 500Django 部署在 Openshift 上出现错误 500
【发布时间】:2014-06-23 11:23:14
【问题描述】:

我在关注这个 Django 在 Openshift 上部署教程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

【问题讨论】:

  • 请在您的 settings.py 中更改 DEBUG=TRUE
  • 为什么?部署的时候不应该是False吗?
  • 如果我们看不到发生了什么,我们怎么能告诉你哪里出了问题?
  • 这只是给我500个服务器错误。这里:mysite-irmantas.rhcloud.com/naujienos
  • 伙伴请切换您的调试选项...

标签: python django openshift


【解决方案1】:

你可以再检查两件事:

首先,您在settings.py 中的ALLOWED_HOSTS 设置怎么样?当你在生产时(这意味着DEBUG 设置为FALSE)你需要正确设置它,否则你会为每个请求得到HTTP 500See Django docs here.

第二件事是为了在您的生产环境中轻松安装正确的库和包,您应该像教程中提到的那样编辑您的setup.py。您的错误消息表明至少缺少一个模块。

你的tutorial已经有一个完整的例子:

# 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 仓库后会这样处理:

当我们进行推送时,所有任务都会自动执行,以便在 Openshift 上安装和配置 Django。这将为我们在远程 Openshift 上执行 $ python setup.py install。

基本上任务顺序是:

  1. 在 setup.py 文件的 install_require 中安装 Django 1.6 和所有包。
  2. 执行脚本部署(文件位于 mysite/.openshift/action_hook)
  3. 并执行 python 脚本 secure_db.py(文件位于 mysite/.openshift/action_hook)为管理员用户创建密码。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    由于您收到 ImportError 异常,假设您已安装所有要求,这可能是 virtualenv 问题。在 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
    

    【讨论】:

      猜你喜欢
      • 2021-06-28
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多