使用openshi部署本地Django应用程序

2024-04-29 16:27:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我用django构建了一个webapp。为了托管它,我正在尝试使用openshift,但是很难让任何东西工作。这方面似乎缺乏一步一步的努力。到目前为止,git运行良好,应用程序在本地开发环境下运行,我已经在openshift上成功地创建了一个应用程序。

一旦创建了openshift上的URL,我就得到了“欢迎使用openshift应用程序”的标准页面。

我已经按照这个https://developers.openshift.com/en/python-getting-started.html#step1尝试更改wsgi.py文件。把它改成hello world,按下它,但我仍然得到openshift默认页面。

有没有一个很好的综合资源可以让本地Django应用程序在Openshift上运行?我能在谷歌上找到的大多数只是一些示例应用,它们并不像我已经构建的那样有用。


Tags: djangohttpsgitcom应用程序url标准环境
3条回答

这些步骤对我很有用: 我已经手动完成了一些步骤,但是您可以在以后使用每个push命令自动完成这些步骤。

  1. 从网站向导使用python-3.3创建新的django应用程序
  2. 将mysql盒带添加到应用程序(我的选项是mysql)
  3. git将创建的应用克隆到本地
  4. 将requirements.txt添加到根文件夹
  5. 将myapp添加到wsgi文件夹
  6. 修改应用程序以引用myapp
  7. 执行git add、commit、push
  8. 使用“rhc tail myapp”浏览应用程序并调试错误
  9. 连接到ssh控制台

    rhc ssh myapp

10.执行

source $OPENSHIFT_HOMEDIR/python/virtenv/venv/bin/activate
  1. 安装丢失的软件包(如果有)
  2. 转到应用程序目录

    cd~/app-root/runtime/repo/wsgi/app-name

  3. 使用以下项进行迁移:

    python manage.py迁移

  4. 创建超级用户:

    python manage.py createsuperuser

15.重新启动应用程序

编辑请记住,这是一个依赖于平台的答案,而且由于服务于Django的OpenShift平台可能会发生更改,因此该答案可能会无效。截至2016年4月1日,本答复在其整个范围内仍然有效。

很多时候,这种情况发生在我身上,因为我必须至少装载5个应用程序,所以我必须创建自己的生命周期:

  1. 不要使用Django墨盒,而是使用python 2.7墨盒。使用Django购物车。尝试更新django版本会带来很多麻烦,如果你从头开始就这么做的话,就不包括这些麻烦了。
  2. 通过git克隆存储库。你将得到yourproject和。。。

    # git clone yourrepo@rhcloud.com:app.git yourproject <- replace it with your actual openshift repo address
    
    yourproject/
    +---wsgi.py
    +---setup.py
    *---.openshift/ (with its contents - I omit them now)
    
  3. 为克隆到本地计算机中的全新存储库制作一个virtualenv。激活它并通过pip和您需要的所有依赖项(例如,一个新的枕头包,MySQL数据库包,…)安装Django。在那里创建一个django项目。喂,你的DJ项目。编辑创建一个wsgi/static目录,其中包含一个空的、虚拟的文件(例如.gitkeep-名称只是约定:您可以使用任何想要的名称)。

     #assuming you have virtualenv-wrapper installed and set-up
     mkvirtualenv myenvironment
     workon myenvironment
     pip install Django[==x.y[.z]] #select your version; optional.
     #creating the project inside the git repository
     cd path/to/yourproject/
     django-admin.py startproject yourjdproject .
     #creating dummy wsgi/static directory for collectstatic
     mkdir -p wsgi/static
     touch wsgi/static/.gitkeep
    
  4. 在那里创建一个django应用程序。说吧,你的应用程序。把它包括在你的项目中。

  5. 你会得到这样的东西(django 1.7):

    yourproject/
    +---wsgi/
    |   +---static/
    |       +---.gitkeep
    +---wsgi.py
    +---setup.py
    +---.openshift/ (with its contents - I omit them now)
    +---yourdjproject/
    |   +----__init__.py
    |   +----urls.py
    |   +----settings.py
    |   +----wsgi.py
    +---+yourapp/
        +----__init__.py
        +----models.py
        +----views.py
        +----tests.py
        +----migrations
             +---__init__.py
    
  6. 像往常一样设置django应用程序(这里我不详细介绍)。请记住相应地在setup.py文件中包含您安装的所有依赖项(这个答案不是描述原因的地方,但是setup.py是包安装程序,openshift使用它在每次部署时重新安装您的应用程序,因此请使其与依赖项保持最新)。

  7. 为模型创建迁移。
  8. 按如下所示编辑给定WSGI脚本的openshift。在包含virtualenv(openshift为python墨盒创建一个)之后,您将包括django WSGI应用程序,因此pythonpath将被正确设置。

    #!/usr/bin/python
    import os
    virtenv = 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 yourdjproject.wsgi import application
    
  9. 编辑钩子。openshift/action_钩子自动执行db sincronization和媒体管理:

    建立挂钩

    #!/bin/bash
    #this is .openshift/action/hooks/build
    #remember to make it +x so openshift can run it.
    if [ ! -d ${OPENSHIFT_DATA_DIR}media ]; then
        mkdir -p ${OPENSHIFT_DATA_DIR}media
    fi
    ln -snf ${OPENSHIFT_DATA_DIR}media $OPENSHIFT_REPO_DIR/wsgi/static/media
    
    ######################### end of file
    

    展开挂钩

    #!/bin/bash
    #this one is the deploy hook .openshift/action_hooks/deploy
    source $OPENSHIFT_HOMEDIR/python/virtenv/bin/activate
    cd $OPENSHIFT_REPO_DIR
    echo "Executing 'python manage.py migrate'"
    python manage.py migrate
    echo "Executing 'python manage.py collectstatic --noinput'"
    python manage.py collectstatic --noinput
    
    ########################### end of file
    
  10. 现在您已经准备好了wsgi,通过导入指向django wsgi,并且您的脚本正在运行。现在是时候考虑我们在这些脚本中使用的静态和媒体文件的位置了。编辑您的Django设置以告诉您希望这些文件位于何处:

    STATIC_URL = '/static/'
    MEDIA_URL = '/media/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static', 'media')
    STATICFILES_DIRS = (os.path.join(BASE_DIR, 'yourjdproject', 'static'),)
    TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'yourjdproject', 'templates'),)
    
  11. 创建一个示例视图、一个示例模型、一个示例迁移,并推送所有内容。

  12. 编辑请记住将正确的设置考虑到这两个环境,以便您可以在本地环境和openshift中测试和运行(通常,这需要有一个local_settings.py,如果文件存在,可以选择导入,但我将省略该部分并将所有内容放在同一个文件中)。请仔细阅读此文件,因为您的localdbname是必须相应设置的值:

    """
    Django settings for yourdjproject project.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/1.7/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/1.7/ref/settings/
    """
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    import os
    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    
    ON_OPENSHIFT = False
    if 'OPENSHIFT_REPO_DIR' in os.environ:
        ON_OPENSHIFT = True
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = '60e32dn-za#y=x!551tditnset(o9b@2bkh1)b$hn&0$ec5-j7'
    
    # Application definition
    
    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'yourapp',
        #more apps here
    )
    
    MIDDLEWARE_CLASSES = (
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
    )
    
    ROOT_URLCONF = 'yourdjproject.urls'
    
    WSGI_APPLICATION = 'yourdjproject.wsgi.application'
    
    # Database
    # https://docs.djangoproject.com/en/1.7/ref/settings/#databases
    
    if ON_OPENSHIFT:
        DEBUG = True
        TEMPLATE_DEBUG = False
        ALLOWED_HOSTS = ['*']
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'youropenshiftgenerateddatabasename',
                'USER': os.getenv('OPENSHIFT_MYSQL_DB_USERNAME'),
                'PASSWORD': os.getenv('OPENSHIFT_MYSQL_DB_PASSWORD'),
                'HOST': os.getenv('OPENSHIFT_MYSQL_DB_HOST'),
                'PORT': os.getenv('OPENSHIFT_MYSQL_DB_PORT'),
                }
        }
    else:
        DEBUG = True
        TEMPLATE_DEBUG = True
        ALLOWED_HOSTS = []
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql', #If you want to use MySQL
                'NAME': 'yourlocaldbname',
                'USER': 'yourlocalusername',
                'PASSWORD': 'yourlocaluserpassword',
                'HOST': 'yourlocaldbhost',
                'PORT': '3306', #this will be the case for MySQL
            }
        }
    
    # Internationalization
    # https://docs.djangoproject.com/en/1.7/topics/i18n/
    
    LANGUAGE_CODE = 'yr-LC'
    TIME_ZONE = 'Your/Timezone/Here'
    USE_I18N = True
    USE_L10N = True
    USE_TZ = True
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/1.7/howto/static-files/
    
    STATIC_URL = '/static/'
    MEDIA_URL = '/media/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static', 'media')
    STATICFILES_DIRS = (os.path.join(BASE_DIR, 'yourdjproject', 'static'),)
    TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'yourdjproject', 'templates'),)
    
  13. Git添加,提交,推送,享受。

    cd path/to/yourproject/
    git add .
    git commit -m "Your Message"
    git push origin master # THIS COMMAND WILL TAKE LONG
    # git enjoy
    
  14. 你的Django应用程序示例已经准备就绪!但是如果你的应用程序有外部的依赖关系,它会毫无理由的崩溃。这就是我告诉你开发一个简单应用程序的原因。现在是时候让依赖项工作了。

    [未经测试!]假设您的项目中存在requirements.txt文件,您可以编辑deploy hook并在命令cd $OPENSHIFT_REPO_DIR之后添加命令,如下所示:pip install -r requirements.txtpip应该存在于virtualenv中,但如果不存在,则可以看到下一个解决方案。

    或者,setup.py是OpenShift上已经提供的方法。我做了很多次-假设存在requirements.txt文件-是:

    1. 打开那个文件,读它所有的行。
    2. 对于每一行,如果它有一个#,删除#和后面的所有内容。
    3. strip前导和尾随空白。
    4. 丢弃空的行,并将结果(即剩余行)作为数组。
    5. 该结果必须分配给setup.py文件中的setup调用中的install_requires=关键字参数。

    很抱歉之前我没有将此内容包含在教程中!但您需要在服务器中实际安装Django。也许这是一个显而易见的建议,每个Python开发人员都可以事先知道。但抓住这个机会,我要说的是:在requirements.txt中包含适当的Django依赖项(或setup.py,取决于您是否使用requirements.txt文件),因为您包含了任何其他依赖项。

这将有助于您装载Django应用程序,并花了我很多时间来标准化进程。享受吧,如果出了什么问题,请随时通过评论与我联系

编辑(对于那些有相同问题但不希望在本文的评论中找到答案的人):请记住,如果您在Windows下编辑构建或部署hook文件并推送这些文件,它们将以0644权限飞向服务器,因为Windows不支持此权限方案Unix已经并且无法分配权限,因为这些文件没有任何扩展名。您会注意到这一点,因为部署时不会执行脚本。因此,尝试仅从基于Unix的系统部署这些文件。

编辑2:您可以使用git钩子(例如pre_commit)设置某些文件的权限,例如管道脚本(build、deploy,…)。请参阅此答案中@StijndeWitt和@OliverBurdekin的评论,以及this question了解更多详细信息。

1)  Step 1 install  Rubygems
Ubuntu - https://rubygems.org/pages/download
Windows - https://forwardhq.com/support/installing-ruby-windows
$ gem
or
C:\Windows\System32>gem
RubyGems is a sophisticated package manager for Ruby.  This is a
basic help message containing pointers to more information……..

2)  Step 2:
$ gem install rhc
Or
C:\Windows\System32> gem install rhc

3)  $ rhc
Or
C:\Windows\System32> rhc

Usage: rhc [--help] [--version] [--debug] <command> [<args>]
Command line interface for OpenShift.

4)  $ rhc app create -a mysite -t python-2.7
Or 
C:\Windows\System32>  rhc app create -a mysite -t python-2.7
# Here mysite would be the sitename of your choice
#It will ask you to enter your openshift account id and password

Login to openshift.redhat.com: Enter your openshift id here
Password : **********


Application Options
---------------------
Domain:    mytutorials
Cartridges: python-2.7
Gear Size:  Default
Scaling:    no

......
......

Your application 'mysite' is now available.

 URL : http://mysite.....................
 SSH to :  39394949......................
 Git remote: ssh://......................

Run 'rhc show-app mysite' for more details about your app.

5)  Clone your site
$ rhc git-clone mysite
Or
D:\> rhc git-clone mysite
.......................
Your application Git repository has been cloned to "D:\mysite"

6)  #”D:\mysite>” is the location we cloned.
D:\mysite> git remote add upstream -m master git://github.com/rancavil/django-openshift-quickstart.git

D:\mysite> git pull -s recursive -X theirs upstream master

7)  D:\mysite> git push
remote : ................
remote: Django application credentials
               user: admin
               xertefkefkt

remote: Git Post-Receive Result: success
.............

8)  D:\mysite>virtualenv venv --no-site-packages
D:\mysite>venv\Scripts\activate.bat
<venv> D:\mysite> python setup.py install
creating .....
Searching for Django<=1.6
.............
Finished processing dependencies for mysite==1.0

9)  Change admin password
<venv> D:\mysite\wsgi\openshift> python manage.py changepassword admin
password:
...
Password changed successfully for user 'admin'
<venv> D:\mysite\wsgi\openshift> python manage.py runserver
Validating models….

10) Git add
<venv> D:\mysite> git add.
<venv> D:\mysite> git commit -am"activating the app on Django / Openshift"
   .......
<venv> D:\mysite> git push



#----------------------------------------------------------------------------------
#-----------Edit your setup.py in mysite with packages you want to install----------

from setuptools import setup

import os

# Put here required packages
packages = ['Django<=1.6',  'lxml', 'beautifulsoup4', 'openpyxl']

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='mysite',
      version='1.0',
      description='OpenShift App',
      author='Tanveer Alam',
      author_email='xyz@gmail.com',
      url='https://pypi.python.org/pypi',
      install_requires=packages,
)

相关问题 更多 >