0

私はdjangoのドキュメント[1]に従って、「ハローワード」のようなGoogle AppEngineWebサイトにi18nを実装しました。

残念ながら、数十のhtmlページ、django、appengineのドキュメントを読んだ後、何が起こっているのか理解できません。

  • 言語コードをdjango_settings.pyに変更すると、ページの言語が変更され、ドロップダウンが現在の言語で更新されます(つまり、LANGUAGE_CODE ='fr'または'es'または'en')
  • ドロップダウンを変更して[言語の変更]をクリックすると、「エラー404」が表示され、URLにはhttp:/// i18n /setlang/と表示されます。

App Engineがデフォルトで使用するdjangoミドルウェアのリストはどこにありますか?これは私がより深く掘り下げるのに役立つかもしれません。

技術要件(i18nが機能する前にアップグレードする予定はありません:-):

  • Python 2.5.4
  • グーグルアプリエンジン1.6.2
  • Django 1.2

[1] [https://docs.djangoproject.com/en/1.2/topics/i18n/]

[2][cssjanus.googlecode.com]私がやりたいことを正確に実行するコード。しかし、私は小さなトリックが恋しい

index.htmlにはこれが含まれています

<form action="/i18n/setlang/" method="post">
    <input name="next" type="hidden" value="/MainPage">
    <select name="language">
        {% for lang in LANGUAGES %} <option value="{{ lang.0 }}"
            {% ifequal LANGUAGE_CODE lang.0 %}
            selected="selected"
            {% endifequal %}>{{ lang.1 }}</option>
        {% endfor %}
    </select>
    <input type="submit" value="{% trans "Change Language" %}">
</form>

app.yaml:

application: i18n
version: 1
runtime: python
api_version: 1

handlers:

- url: .*
  script: helloworld.py`

django_seetings.py

import os

DEBUG = True
TEMPLATE_DEBUG = DEBUG

LANGUAGE_CODE = 'fr'
USE_I18N = True

gettext = lambda s: s
LANGUAGES = (
  ('en', gettext('English')),
  ('fr', gettext('French')),
  ('es', gettext('Spanish')),
)

INSTALLED_APPS = (
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions', 
)
SESSION_ENGINE = 'gae_sessions'

helloworld.py(私はurls.pyを使用しません)

# coding=UTF-8

# Standard Python imports.
import os
import sys
import logging
import __builtin__

# Google App Hosting imports.
from google.appengine.dist import use_library
use_library('django', '1.2')

# Enable info logging by the app (this is separate from appserver's
# logging).
logging.getLogger().setLevel(logging.INFO)

# Must set this env var *before* importing any part of Django.
os.environ['DJANGO_SETTINGS_MODULE'] = 'django_settings'

from google.appengine.ext.webapp import util 
# Import the part of Django that we use here.


from google.appengine.ext import webapp

from views import MainPage

from django.conf.urls.defaults import include

def main():
    # Create a Django application for WSGI
    application = webapp.WSGIApplication([('/', MainPage),                                        
                                    (r'^i18n/', include('django.conf.urls.i18n')),
                                     ], debug=True)


    # Run the WSGI CGI handler with that application.
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

views.py

'''
Created on Apr 24, 2012

@author:xxxx
'''
import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from django.utils.translation import ugettext #ok

from django import http
from django.http import HttpResponseRedirect
import django_settings  
from django.utils.translation import check_for_language
#from django.shortcuts import render_to_response

#def MainPage(request):

class MainPage(webapp.RequestHandler):
    def get(self):
        template_values = {
            'helloworld': ugettext("helloworld!"),
            'title': ugettext("home page"),
        }

        path = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(path, template_values))
        #return render_to_response('index.html', template_values)  

helloworld.py

# coding=UTF-8

# Standard Python imports.
import os
import sys
import logging
import __builtin__

# Google App Hosting imports.
from google.appengine.dist import use_library
use_library('django', '1.2')

# Enable info logging by the app (this is separate from appserver's
# logging).
logging.getLogger().setLevel(logging.INFO)

# Must set this env var *before* importing any part of Django.
os.environ['DJANGO_SETTINGS_MODULE'] = 'django_settings'

from google.appengine.ext.webapp import util 
 # Import the part of Django that we use here.


from google.appengine.ext import webapp

from views import MainPage

from django.conf.urls.defaults import include

def main():
    # Create a Django application for WSGI
    application = webapp.WSGIApplication([('/', MainPage),                                        
                                        (r'^i18n/', include('django.conf.urls.i18n')),
                                         ], debug=True)


    # Run the WSGI CGI handler with that application.
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()
4

1 に答える 1

1

djangoルーティングとwebappのルーティングを混同しているようです。include('django.conf.urls.i18n')の初期化プロセスのようにステートメントを使用できるとは思いませんwebapp.WSGIApplication

さらに、gregが言うように、Python2.7ランタイムを使用することもお勧めします。これは、新しいランタイムでdjango(信じてください、とても簡単です)を使用する方がはるかに簡単だからです。

更新:Python2.7ランタイムでdjango-1.3を実行するための手順を追加しました

djangoをpython2.7ランタイムで動作させるための大まかな手順は次のとおりです。

プロジェクトを作成する

$ env PYTHONPATH=/somewhere/google_appengine/lib/django_1_3 \
   python /somewhere/google_appengine/lib/django_1_3/django/bin/django-admin.py\
   startproject my_django_project
$ cd my_django_project

app.yamlでenv_variablesを構成することにより、django設定ファイルにsettings.pyを使用できます。

app.yamlを作成します

application: tmatsuo-hr
version: 1
runtime: python27
api_version: 1
threadsafe: true

env_variables:
  DJANGO_SETTINGS_MODULE: 'settings'

handlers:
- url: /.*                                                                                                                                                     
  script: main.app                                                                                                                                             

libraries:                                                                                                                                                     
- name: django                                                                                                                                                 
  version: 1.3                                                                                                                                                 

djangoアプリを作成する

$ env PYTHONPATH=/somewhere/google_appengine/lib/django_1_3 \
   python manage.py startapp myapp                                                                    

main.pyを作成します

import django.core.handlers.wsgi

app = django.core.handlers.wsgi.WSGIHandler()

settings.pyを構成します

ROOT_URLCONF = 'urls'
Add 'myapp' to your INSTALLED_APPS

urls.pyを構成する

url(r'^$', 'myapp.views.index', name='index'),

myapp/views.pyでビューを作成します

# Create your views here.

from django.http import HttpResponse

def index(request):
    return HttpResponse('Hello World!')

終わり。このプロジェクトは、通常のdjangoアプリケーションと同じ方法で構成できるはずです。

ただし、SQLバックエンドが必要なため、Djangoのモデルを使用することはできません。そうしたい場合は、django-nonrelを確認するか、CloudSQLでdjangoを使用することを検討してください。

于 2012-04-26T08:34:41.190 に答える