ラベル Django の投稿を表示しています。 すべての投稿を表示
ラベル Django の投稿を表示しています。 すべての投稿を表示

2016年5月6日金曜日

GAE で、Django/Sitemaps を使う。

こちらの続きです。
http://yamayoshi.blogspot.jp/2016/05/gaep-django18-djangae.html
http://yamayoshi.blogspot.jp/2016/05/djangae-ndb.html

GAE のデータベース(NDB)は、Django のモデルを使えないので、当然、サイトマップフレームワーク(Sitemaps)も使えません。
でも、djangae によって、この問題を解決出来そうです。

こちらを参考に。
https://docs.djangoproject.com/en/1.8/ref/contrib/sitemaps/

1.概要
・設定ファイルにフレームワーク(SitesとSitemaps)を追加
・サイトマップクラスの作成
・URLディスパッチャーの設定
・サイトIDの生成
・設定ファイルに SITE_ID を追加
・サイトマップを確認

2.コード

2-1.設定ファイルにフレームワーク(SitesとSitemaps)を追加

$ cd ~/gae/project
$ nano mysite/settings.py
--
INSTALLED_APPS = (
 〜
 'home',
 'django.contrib.sites',  #追加
 'django.contrib.sitemaps', #追加
)
--

2-2.サイトマップクラスの作成 (新規)

$ nano home/sitemaps.py
--
# encoding: UTF-8
from django.contrib.sitemaps import Sitemap
from .models import *

class IndexSitemap(Sitemap):
 def items(self):
  return ['index']
 def location(self, obj):
  return '/'

class LinkSitemap(Sitemap):
 limit = 10
 def items(self):
  return Link.objects.all()
--

※ LinkSitemap クラスで、Link モデルからデータを読みだします。

2-3.URLディスパッチャーの設定

$ nano mysite/urls.py
--
# encoding: UTF-8
from django.conf.urls import include, url
from django.contrib import admin
from home import views
from django.contrib.sitemaps import views # Sitemapsのビュー
from home import sitemaps as hs

sitemaps = {
 'index': hs.IndexSitemap,
 'links': hs.LinkSitemap, # home/sitemaps の LinkSitemap クラス
}

urlpatterns = [
 url(r'^', include('home.urls')),
 url(r'^admin/', include(admin.site.urls)),
 url(r'^sitemap\.xml$', views.index, {'sitemaps': sitemaps}),
 url(r'^sitemap-(?P<section>.+)\.xml$', views.sitemap, {'sitemaps': sitemaps}),
]
--

3.サイトIDの生成

開発用サーバを起動
$ python ../google_appengine/dev_appserver.py ./

ブラウザで、adminページにアクセス
=> http://localhost:8080/admin/

サイトを登録
Site -> Add で、Domain name と Display name を入力 -> Save

SDK のコンソールにアクセス
=> http://localhost:8000/

Datastore Viewer -> Entity Kind「django_site」を選択 -> ListEntities

ID を確認します。

4.設定ファイルに サイトID を追加

$ nano mysite/settings.py
--
DEBUG = True
SITE_ID = xxxxxxxxxxxxxxxxxx #追加
--

5.サイトマップを確認

ブラウザで、サイトマップにアクセス
=> http://localhost:8080/sitemap.xml

6.所感

サイトマップフレームワークは、sitemap.xml をインデックスとして、複数のサイトマップを自動生成してくれます。
これが、本当にすばらしいと思います。

ちょっと悩んだのは、SITE_ID...
admin ページで入力して、SDK のコンソールで ID を確認するってのがミソ。
最初、なにげなく「1」と入れたら、アッサリとエラーで弾かれ.. 汗汗。

さて、動作確認は、ここまでとして、以前作ったものを Django1.8+djangae に移行したいと思います。

djangae で NDB にデータを格納する。

こちらの続きです。
http://yamayoshi.blogspot.jp/2016/05/gaep-django18-djangae.html

1.概要
・モデル(home/models.py)の定義
・URLディスパッチャーの設定(mysite/urls.py と home/urls.py)
・ビュー(home/views.py)を書く
・データを格納
・adminページでデータを確認

2.コードを書く

2-1.モデルの定義

こらを参考に。
https://docs.djangoproject.com/en/1.8/topics/db/models/

$ cd ~/gae/project
$ nano home/models.py
--
# encoding: UTF-8
from django.db import models
from django.utils.http import urlquote

class Link(models.Model):
 url   = models.CharField(max_length=200, primary_key=True)
 title = models.CharField(max_length=200)
 dt    = models.DateTimeField(auto_now=True)

 def get_absolute_url(self):
  return "/url/?" + self.url

 class Meta:
  ordering = ['-dt']
--

設定ファイルにモデル(の入っている場所)を追加

$ nano mysite/settings.py
--
INSTALLED_APPS = (
 〜
 'home', #追加
)
--

adminページでモデルを読み込めるように。

$ nano home/admin.py
--
# encoding: UTF-8
from django.contrib import admin
from .models import *

class LinkAdmin(admin.ModelAdmin):
 list_display = ('url', 'title', 'dt')

admin.site.register(Link, LinkAdmin)
--

2-2.URLディスパッチャーの設定

こちらを参考に。
https://docs.djangoproject.com/en/1.8/topics/http/urls/

まず、メインのディスパッチャー。

$ nano mysite/urls.py
--
# encoding: UTF-8
from django.conf.urls import include, url
from django.contrib import admin
from home import views

urlpatterns = [
 url(r'^', include('home.urls')),
 url(r'^admin/', include(admin.site.urls)),
]
--

続いて、アプリケーションのディスパッチャー。

$ nano home/urls.py
--
# encoding: UTF-8
from django.conf.urls import url
from . import views

urlpatterns = [
 url(r'^test/', views.test),
]
--

2-3.ビューを書く

こちらを参考に。
https://docs.djangoproject.com/en/1.8/topics/http/views/

$ nano home/views.py
--
# encoding: UTF-8
from django.http import *
from .models import *
from datetime import datetime

def test(request):

 for i in range(1, 100):
  res = datetime.now()
  link = Link(url=res, title=i)
  link.save()

 return HttpResponse(res)
--

3.データを格納

開発用サーバを起動
$ python ../google_appengine/dev_appserver.py ./

ブラウザで、testページにアクセス。しばらく待つ。
=> http://localhost:8080/test/

データの格納が完了すると、こんな表示が出ます。
 2016-05-06 01:07:42.358893

4.データを確認

ブラウザで、adminページにアクセスして、データを確認。
=> http://localhost:8080/admin/

 HOME -> Links に、いっぱい入ってます。

5.所感

とりあえず、Django のモデルで、データの格納が出来ました。
裏で NDB が動いてるので、なんらかの制限はありそうですが、普通に使えそうです。

次は、いよいよ、Sitemaps に挑戦!!
実は、これをやりたかったんだよね。

2016年5月4日水曜日

GAE/P + Django1.8 + djangae に挑戦!

一応、動作を確認できたので、忘れないうちに書き込んでおきます。

1.構成

こんなカンジで配置していきます。

gae/
├ google_appengine/ … GAE の SDK です。
├ venv/
│ └ … Django1.8 … プロジェクト作成用です。
└ project/
  ├ mysite/
  │ ├ settings.py
  │ ├ wsgi.py
  │ └ urls.py
  ├ home/
  ├ lib/ … GAE にアップロードするライブラリの置き場です。
  │ └ Django1.8, djangae,
  ├ appengine_config.py
  ├ app.yaml

2.SDK のインストール

こちらからダウンロードして解凍します。
https://cloud.google.com/appengine/downloads

$ cd
$ mkdir gae
$ cd ~/gae
$ wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.36.zip
$ unzip google_appengine_1.9.36.zip
$ rm google_appengine_1.9.36.zip

3.Django プロジェクトの作成

3-1.仮想環境にDjango1.8をインストールします。

$ cd ~/gae
$ virtualenv venv
$ source ~/gae/venv/bin/activate
V pip install django==1.8.7

3-2.仮想環境内に、プロジェクトとアプリケーションを作成します。

V django-admin.py startproject mysite
V mv mysite project
V cd project
V python manage.py startapp home

※ プロジェクト名(project)とアプリケーション名(home)は仮です。

4.ライブラリの追加

GAE にアップロードするライブラリを /lib にインストールします。

V cd ~/gae/project
V mkdir lib
V pip install -t lib Django==1.8.7 djangae
V deactivate

5.各種設定

$ cd ~/gae/project

5-1. mysite/settings.py (変更)

① 最初に、これ。

# encoding: UTF-8
from djangae.settings_base import *

② インストール・アプリケーション

INSTALLED_APPS = (
 'djangae', #1行目に追加
 〜
 'djangae.contrib.gauth.datastore', #最終行に追加 Google認証用
)

③ ミドルウェア

MIDDLEWARE_CLASSES = (
 'google.appengine.ext.appstats.recording.AppStatsDjangoMiddleware', #1行目に追加 appstats用
 'djangae.contrib.security.middleware.AppEngineSecurityMiddleware', #追加
 〜
 #'django.contrib.auth.middleware.AuthenticationMiddleware', #コメントアウト
 'djangae.contrib.gauth.middleware.AuthenticationMiddleware', #追加 Google認証用
 〜
)

④ データーベース

DATABASES = {
 'default': {
  'ENGINE': 'djangae.db.backends.appengine',
 }
}

⑤ 最後に、これ。

from djangae.contrib.gauth.settings import *  # 最終行に追加

5-2. mysite/wsgi.py (変更)

--
# encoding: UTF-8
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
#application = get_wsgi_application()  #コメントアウト
from djangae.wsgi import DjangaeApplication #2行追加
application = DjangaeApplication(get_wsgi_application())
--

5-3. appengine_config.py (新規作成)

こちらを参考に。
http://d.hatena.ne.jp/noazoh/20140924/1411553513

--
# encoding: UTF-8
import os
import sys
import logging
BASE_DIR = os.path.dirname(__file__)
LIB_DIR = os.path.join(BASE_DIR, 'lib') #ライブラリの置き場所
sys.path.append(LIB_DIR)
sys.path.append(os.path.join(LIB_DIR, "dateutil"))
from google.appengine.ext import vendor
vendor.add('lib')
--

5-4. app.yaml (新規作成)

こちらを参考に。
https://cloud.google.com/appengine/docs/python/config/appref

--
application: myapp
version: alpha-001
runtime: python27
api_version: 1
threadsafe: true
builtins:
- appstats: on
handlers:
- url: /static/admin/
  static_dir: lib/django/contrib/admin/static/admin/
  secure: always
- url: /admin.*
  script: mysite.wsgi.application
  secure: always
  login: admin
- url: /.*
  script: mysite.wsgi.application
--

6.動作確認

$ cd ~/gae/project
$ python ../google_appengine/dev_appserver.py ./

ブラウザで確認します。
① http://localhost:8080  => おなじみの It worked! が表示されれば成功です。
② http://localhost:8080/admin/  => Django administration を使えます。
③ http://localhost:8080/_ah/stats/  => appstats を使えます。素晴らしい!!
④ http://localhost:8000  => SDK で コンソールも使えます。

7.所感など

なんとか、ここまでたどり着きました。
Web等で情報を探しても、なかなか見つからなかったけど、とりあえず、やりたいことは出来そうなカンジです。

引き続き、models とか、Sitemaps とか、試してみます。

8.おまけ

mysite/settings.py
--
# encoding: UTF-8

from djangae.settings_base import *

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '&c&k%d%s84me^(2i^hq7e$x6*b%93#wfn!n5kfjzn65+e4yw-5'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = (
'djangae',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#
'djangae.contrib.gauth.datastore',
)

MIDDLEWARE_CLASSES = (
'google.appengine.ext.appstats.recording.AppStatsDjangoMiddleware',
'djangae.contrib.security.middleware.AppEngineSecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
#'django.contrib.auth.middleware.AuthenticationMiddleware',
'djangae.contrib.gauth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)

ROOT_URLCONF = 'mysite.urls'

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

WSGI_APPLICATION = 'mysite.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'djangae.db.backends.appengine',
}
}


# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/

STATIC_URL = '/static/'

from djangae.contrib.gauth.settings import *
--

djangae 勝手に日本語訳 - インストール

原文:
https://djangae.readthedocs.io/en/latest/installation/

Installation
ja> インストール

If you just want to get started on a fresh Django project, take a look at djangae-scaffold
ja> あなただけの新鮮なDjangoプロジェクトを始めたい場合は、djangae-scaffold を見て下さい。

Alternatively, you can also follow this guide:
ja> 代わりに、あなたはまた、このガイドに従うことができます。

1.Create a Django project, add app.yaml to the root. Make sure Django 1.7+ is in your project and importable
ja> Djangoプロジェクトを作成し、ルートディレクトリに app.yaml を追加します。Djangoの1.7以降は、プロジェクトにインポート可能であることを確認してください。

2.Install Djangae into your project, make sure it's importable (you'll likely need to manipulate the path in manage.py and wsgi.py)
ja> あなたのプロジェクトに Djangae をインストールし、インポート可能であることを確認してください。(あなたはおそらく manage.py と wsgi.py で、適切なパスを設定する必要があります。)

3.Add djangae to INSTALLED_APPS.
ja> settings.py の INSTALLED_APPS に djangae を追加します。

4.At the top of your settings.py, insert the following line to setup some default settings:
ja> settings.py の上部に、次の行を挿入します。

 from djangae.settings_base import *

In app.yaml add the following handlers:
ja> app.yaml に、以下のハンドラを追加します。

 * url: /_ah/(mapreduce|queue|warmup).*
  script: YOUR_DJANGO_APP.wsgi.application
  login: admin

 * url: /.*
  script: YOUR_DJANGO_APP.wsgi.application

Make your manage.py look something like this:
ja> このようなかんじで、manage.py を作ります。

 if __name__ == "__main__":
  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
  from djangae.core.management import execute_from_command_line
  execute_from_command_line(sys.argv)

Use the Djangae WSGI handler in your wsgi.py, something like
ja> wsgi.py に、djangae WSGIハンドラを適用します。

 from django.core.wsgi import get_wsgi_application
 from djangae.wsgi import DjangaeApplication
 application = DjangaeApplication(get_wsgi_application())

Add the following to your URL handler:
ja> (urls.pyの)URLハンドラに以下を追加します。

 url(r'^_ah/', include('djangae.urls'))

It is recommended that for improved security you add
djangae.contrib.security.middleware.AppEngineSecurityMiddleware as the first of your middleware classes. This middleware patches a number of insecure parts of the Python and App Engine libraries and warns if your Django settings aren't as secure as they could be.
ja> セキュリティの向上のために、あなたのミドルウェアクラスの最初に、djangae.contrib.security.middleware.AppEngineSecurityMiddleware を追加することをお勧めします。本ミドルウェアは、PythonとApp Engineのライブラリの安全でない部品をパッチし、安全でない場合は警告を表示します。

If you wish to use the App Engine's Google Accounts-based authentication to authenticate your users, and/or you wish to use Django's permissions system with the Datastore as you DB, then see the section on Authentication.
ja> ユーザーを認証するために App Engine の Googleアカウントベースの認証を使用する場合、または、DBなどのデータストアでDjangoの権限システムを使用したい場合は、認証のセクションを参照してください。

It is highly recommended that you read the section on Unique Constraints
ja> Unique Constraints のセクションを読むことを強くお勧めします。

GAE vs VPS

Django を使うには、GAE or VPS どちらが良いのだろう??

GAE(Google App Engine)の良い所
・(ある程度)無料で使える。
・開発環境(SDK)が用意されている。
・ストレージやタスクキューが標準で準備されている。
・(お金を出せば)オートスケールできる。
・appstats 超ヤバイ!!

VPS(Virtual Private Server)の良い所。
・OSやライブラリーを自由に選択できる。
・Djangoの全ての機能を使うことができる。

と、どちらも一長一短。

最近、ABLENET の VPS で Django1.8 を使い始めたのだが、環境を作るのが、やっぱ大変なんだよね。
で、GAE で Django1.8 を使えないか探してたら、djangae を見つけた。

djangae は GAE の NDB を Django の models として使えるみたい。おぉ〜これすごいかも。
これで、admin も Sitemaps を使えるぞ。

と言うことで、しばらく GAE/P + Django1.8 + djangae でやってみよう。
続きは、おぃおぃと。

2016年5月3日火曜日

Djangae(じゃんじー)とは。

まだ、調査中ですが、これ、よさそうです。

本家:
https://djangae.readthedocs.io

この一文が、本気。
The best way to run Django on Google App Engine.

訳:
「Djangae(じゃんじー)」は、GAE(Google App Engine)で、Djangoを使う、最高の方法(Best Way)です。

概要ですが、これも、良いねぇ。
Djangae (jan-gee) is a Django app that allows you to run Django applications on Google App Engine, including (if you want to) using Django's models with the App Engine Datastore as the underlying database.

超訳:
 GAEでDjangoを使うなら、Djandaeをインストールしろ!!!!!!!!!!!!!!!!!!!!!

いじょう。
(もう少し、調べてみます。)

2016年2月14日日曜日

Django1.8 と Celery3.1.20 で、DBに非同期書き込み

やりたいことはタイトルの通りだけど、Webの情報に翻弄され、中々ゴールに辿りつけず。
忘れない内に、メモメモ。

環境
Ubuntu14
RabbitMQ
Django1.8
Celery3.1.20

1.RabbitMQ インストール

$ sudo apt-get install rabbitmq-server

2.Django インストール

$ cd
$ virtualenv env
$ source ~/env/bin/activate
$ pip install --upgrade pip
$ pip install Django==1.8 celery==3.1.20
$ pip freeze
$ cd env

3.アプリケーション

$ django-admin.py startproject proj
$ cd proj
$ python manage.py startapp app1

〜 中略 〜 ※本論では無いので、一旦省略(^^;

4.Django で Celery を使えるようにする。

マニュアルは、こちら
http://docs.celeryproject.org/en/latest/django/index.html

4-1.ファイル構成

proj/
├manage.py
├proj/
│├__init__.py  # 4.3参照
│├settings.py
│├celery.py    # 4.2参照
│└urls.py
└app1/
 ├admin.py
 ├models.py
 ├views.py     # 6参照
 └tasks.py     # 5参照

4-2.Celery インスタンスを定義

File: proj/proj/celery.py
--
from __future__ import absolute_import
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
from django.conf import settings
app = Celery('proj')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
--

4-3.Django 起動時にインスタンスをロード

File: proj/proj/__init__.py
--
from __future__ import absolute_import
from .celery import app as celery_app
--

5.非同期にDBに書き込むタスクを定義

File: proj/app1/tasks.py
--
from __future__ import absolute_import
from celery import shared_task
from .models import Word

@shared_task
def put_word(word):
 w, c = Word.objects.get_or_create(word=word)
 return "ok"
--

# models.py の説明は省略してます。

6.Vewからタスクに渡す

File: proj/app1/views.py
--
from .tasks import put_word

def test(request):
 word = "xxxxxxxx"
 put_word(word)
 return HttpResponse("ok")
--

# urls.py の説明は省略しています。

7.開発サーバを起動して、動作確認

$ celery -A proj worker -l info
$ python manage.py runserver

8.まとめ

Google App Engine では標準で使える機能を、自前で実装できました。
データベースへの書き込みは、レスポンスへの影響が大きい為、できる限り非同期で実行させたいもの。
日本語の情報も少なく、少し苦労したので、どなたかの参考になれば、幸いです。

2016年1月21日木曜日

Ubuntu14.04で、NginxとuWSGI(emperor)を構築

ABLE.net の VPS で、WEBサーバを構築する手順です。

1. インストール

$ sudo apt-get install nginx uwsgi uwsgi-plugin-python python-pip

2. ポートを開く

$ sudo ufw allow 80

3. Nginx の設定

デフォルトのサイト設定を削除しておきます。

$ sudo rm /etc/nginx/sites-enabled/default

設定ファイルの例です。

FILE: /etc/nginx/conf.d/<サイト名>.conf
--
server {
 listen 80;
 server_name <サイトURL>;
 location / {
  uwsgi_pass unix:/tmp/<サイト名>.sock;
  include uwsgi_params;
 }
}
--
※ UNIXソケット(.sock)で、uWSGI に連結します。

再起動しておきます。
$ sudo service nginx restart

4. uWSGI (emperor) の設定

必要なディレクトリを作成します。

$ sudo mkdir -p /etc/uwsgi/vassals
$ sudo mkdir -p /var/log/uwsgi

設定ファイルです。

FILE: /etc/init/uwsgi.conf
--
description "uWSGI"
start on runlevel [2345]
stop on runlevel [06]
respawn
env UWSGI=/usr/local/bin/uwsgi
env LOGTO=/var/log/uwsgi/emperor.log
exec $UWSGI --master --emperor /etc/uwsgi/vassals --die-on-term --logto $LOGTO
--

emperorモードで起動し、/etc/uwsgi/vassals の iniファイルを監視します。

$ sudo service uwsgi restart

5. Django の動作確認

virtualenv 環境に、Django を入れます。

$ cd
$ virtualenv venv
$ cd venv
$ source bin/activate
$ pip install Django
$ django-admin.py startproject mysite
$ cd mysite

$ deactivate

6. uWSGI 設定ファイル

Nginx から uWSGI に連結する為に、iniファイルを作成します。

設定ファイルの例です。

FILE: /etc/uwsgi/vassals/<サイト名>.ini
--
[uwsgi]
# Variables
base = /home/<ユーザ名>/venv
app  = <サイト名> # Djangoのデフォルトは、mysite
# Generic Config
home   = %(base)
chdir  = %(base)/%(app)
module = mysite.wsgi
socket = /tmp/%n.sock
chmod-socket = 666
py-autoreload = 1 #reload on change python file
plugins = python
--

7.まとめ

全体の繋がりは、以下の通り。

 WEBアクセス -> Nginx -> uWSGI -> Django

複数のサイトを動かす場合は、
・Nginx の <サイト名>.conf
・uWSGI の <サイト名>.ini
・アプリケーション(Django等)
を準備します。

2013年9月23日月曜日

GAE/Djanigo で、メールとキャッシュを使う

Django には、メール送信や、キャッシュを使う仕組みがありますが、GAE(GoogleAppEngine)で、これを使うには、どうすれば良いのだろう??

GAE のサービスに、メールとキャッシュのAPIはあるので、このAPIを直接使うしかないのか??

と、調べてみると、良いものを見つけました。

django-gae-backends


1.使い方

1-1.プログラムの配置

ダウンロードして、ここに置きました。

mysite/
├mysite/
│ └settings.py
└gae_backends/
 ├__init.py__
 ├mail.py
 └memcache.py

1-2.設定

settings.py に、以下を追加。

-- settings.py --

EMAIL_BACKEND = 'gae_backends.mail.EmailBackend'
SERVER_EMAIL = '<Gmailのメールアドレス>'

ADMINS = (
 ('<管理者の名前>', '<管理者のメールアドレス>'),
)

CACHES = {
 'default': {
  'BACKEND': 'gae_backends.memcache.MemcacheCache',
 }
}

MIDDLEWARE_CLASSES = (
 'django.middleware.cache.UpdateCacheMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.cache.FetchFromCacheMiddleware',
)

LOGGING = {
 デフォルトのままでOK

--

1-3.メール送信

エラーが発生すると、管理者宛にメールが送信されます。

プログラム内で使う場合は、マニュアルを読んで下さい。

1-4.キャッシュ

UpdateCacheMiddleware と FetchFromCacheMiddleware によって、サイト単位のキャッシュが有効になっています。

2013年5月1日水曜日

Nginx + uWSGI で、Django を起動する。

タイトルそのままですが、一応動いたので、忘れる前にメモ。

OS は、Ubuntu12.04 です。

1.インストール


# apt-get install nginx
# pip install Django==1.4 uwsgi

2.設定


まず、Nginx 側。
location / へのアクセスを、uwsgi_pass で、127.0.0.1:4000 に飛ばしています。
ポートは、4000以外でも良いです。

File: /etc/nginx/sites-available/default
--
location / {
 uwsgi_pass 127.0.0.1:4000;
 include uwsgi_params;
}
--

次は、uWSGI。
/etc/init にconf ファイルを置くことで、自動的にuWSGIを起動します。
ポート4000で待ち受けて、uWSGI を起動(exec)します。
起動パラメータ:
 --chdir /home/<ユーザ名>/mysite … Django プロジェクトのディレクトリに移動
 --wsgi-file mysite/wsgi.py … プロジェクト内の wsgi.py を指定

File: /etc/init/uwsgi.conf
--
# simple uWSGI script
description "uwsgi tiny instance"
start on socket PROTO=inet PORT=4000
stop on runlevel [06]
exec uwsgi --master --processes 2 --die-on-term --chdir /home/akira/mysite --wsgi-file mysite/wsgi.py

3.Django プロジェクトの作成


ユーザのホームディレクトリに作ります。

# cd
# django-admin.py startproject mysite

/home/<ユーザ名>/mysite/mysite/wsgi.py の出来上がりです。

ここで、一旦、リブートしておきます。

4.動作確認


ブラウザからアクセスして、Django の画面が出ることを確認しましょう。

参考




2013年3月2日土曜日

GAE/P + Django1.4 で、セッションを使う

GAE(Google App Engine)/P + Django1.4 で、セッションを使う方法です。
バックエンドに、キャッシュを使ってます。

プロジェクトの雛形は、こちらを参考にしましたが、Django1.4 では、CACHE_BACKEND = 'memcached:///' は使えません..

1.ディレクトリー構成

Django1.4標準のディレクトリ構成とは若干異なりますが、あまり気にしなくても良いかと。

/app
 app.yaml
 main.py
 favicon.ico
 /project
  __init.py__
  settings.py
  urls.py
  views.py
  /templates
   index.html

2.app.yaml

Python2.7 + Django1.4 を使います。

-- app.yaml --
application: <アプリケーション名>
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
 static_files: favicon.ico
 upload: favicon\.ico

- url: .*
 script: main.app

libraries:
- name: django
 version: "1.4"

3.main.py

sysモジュール'memcache'を、google.appengine.api.memcacheにエイリアスしています。

-- main.py --
import os, sys
import django.core.handlers.wsgi
from google.appengine.api import memcache

sys.modules['memcache'] = memcache
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
app = django.core.handlers.wsgi.WSGIHandler()

4.settings.py

MIDDLEWARE_CLASSES に、SessionMiddleware を追加。
SESSION_ENGINE には、キャッシュを使います。
CACHES の BACKEND に、memcached を使います。

-- settings.py --
import os

DEBUG = True

TIME_ZONE = 'Asia/Tokyo'
USE_TZ = False

LANGUAGE_CODE = 'ja-jp'

MIDDLEWARE_CLASSES = (
 'django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
)

INSTALLED_APPS = (
 'django.contrib.humanize',
 'project'
)

ROOT_URLCONF = 'project.urls'

ROOT_PATH = os.path.dirname(__file__)
TEMPLATE_DIRS = (
 ROOT_PATH + '/templates',
)

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
 }
}

5.views.py

セッションデータの書き込み
request.session['<キー名>'] = '<データ>'

セッションデータの読み出し
xxx = request.session['<キー名>']

6.参考

セッションの使い方
http://docs.djangoproject.jp/ja/latest/topics/http/sessions.html
キャッシュフレームワーク
http://docs.djangoproject.jp/ja/latest/topics/cache.html#topics-cache