2012年12月10日月曜日

PythonでのWebプログラミング

PythonでのWebプログラミング

今朝起きたらカレンダーでアドベントカレンダー担当がでってビックリしたから、以下の記事は多分足りない部分が多いけど、読んだらちょっと面白そうと思われる人がいるんでしたら、遠慮なく、声かけて下さい。。。そしたらもうちょっと細かく説明する。



簡単なウェブプログラミングと言われると多くの人はRORを考えると思うけど、実は多くの言語が複数フレームワークがある。今回はPythonと言うスクリプト言語について軽く話すつもり。Pythonにも複数フレームワークがあって例として以下のリンクがある:

今回はその中の1つ、Djangoの使い方をもうちょっと細かく見るつもり。

Django

まず、djangoがまだインストールしていなければ、Debian系のLinuxシステムの場合は簡単に以下のコマンドでインストール出来る。

    apt-get install python-django

Djangoはインストールし終わったら、新たなプロジェクトを作成して見よう。

    django-admin.py startproject tester

このコマンドを実行すれば「tester」と言うフォルダが出来て、その中身は以下の通り、

    /tester
        manage.py
        /tester
            __init__.py
            settings.py
            urls.py
            wsgi.py

このファイルの中に基本的にいじるファイルは「settings.py」と「url.py」のみ。
現状の何もないプロジェクトを一回動かして見たいでした、以下のコマンドはテストサーバを起動する。

    python2 manage.py runserver











次のステップは「/tester/settings.py」の中にデータベースの設定。今回はmysqlを使うだけどDjangoはPostgres,sqlite3,Oracleも対応している。使うデータベースとpythonモジュールをインストール確認して。debian系だったら、Pythonモジュールは「python-mysqldb」と言われる。データベースとデータベースユーザを作ったから、「tester/settings.py」のDB部分に以下のように変更すれば完成。


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'tester',                      # Or path to database file if using sqlite3.
        'USER': 'tester',                      # Not used with sqlite3.
        'PASSWORD': 'unko',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

設定があっていれば、

    python2 manage.py syncdb

のコマンドでDBのセットアップスクリプトが動かす。最初の質問はこのDjangoプロジェクトにスーパユーザを作成するかどうか。「yes」を答えて、次にそのユーザ名、eメール、パスワードを入力すれば、DB設定のインストールは完成。

次はこのプロジェクトのアプリを作成するので、

    python2 manage.py startapp unko

を作成しよう。これ実行したらアプリディレクトリを以下の通りで作成する。

    /unko
        __init__.py
        models.py
        tests.py
        views.py

こん回のアプリはシンプルはポールアプリ作成するつもりから、Djangoを使う場合は基本的にDBのデザインから始まるので「unko/models.py」で以下のような感じにしよう。

from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Chose(models.Model):
    poll = models.ForeignKey(poll)
    choise = models.CharField(max_length=200)
    votes = models.IntegerField()

このようなシンプルなコードで、Djangoはデータベーステーブルとテーブル接続APIも作成する。ただDjangoはまだこのアプリのアクセスパス知らないから「/tester/settings.py」の「INSTALLED_APPS」の最後に

    'unko',

を追加する必要。「python2 manage.py syncdb」また実行すれば、新しく追加したテーブルをDBにも追加する。

次はadminサイトを有効するので先ほどの「/tester/settings.py」の「INSTALLED_APPS」へ、

    'django.contrib.admin',

のコメントを外して「/tester/urls.py」の中に

    from django.contrib import admin
    admin.autodiscover()

とそのしたの

    url(r'^admin/', include(admin.site.urls)),

のコメントも外しましょう。そしたらテストサーバを動かしたら、「0.0.0.0:8000/admin」へアドミン画面がアクセス出きるんだが、ログインしても何も出来ないから,「/unko/admin.py」のファイルを作成し、以下の通りにすればアドミンユーザはポールは作成出来るようになる。

from unko.models import Poll
from unko.models import Choise
from django.contrib import admin
class ChoiceInLine(admin.StackedInLine):
    model = Choise
    extra = 3
class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,  {'fields':['question']}),
        ('Date information', {'fields':['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]
admin.site.register(Poll, PollAdmin)

この上のコードはアドミン画面作成だけではなく、ポールの作成画面ちょっと綺麗に整理するも!
「python2 manage.py syndb」をした後で、テストサーバからアクセス出来るようになる





















これからは利用者を見れる部分につつける,まずURLの設定にいじってみよう。
「/tester/url.py」の中に以下の行を追加すればポールのURLルールは完成。見たら多分分かるだけど、regexでURLをマッチし、unkoアプリのviewsの部分にリダイレクトする感じ。

    url(r'^polls/$', 'unko.views.index'),
    url(r'^polls/(?P<poll_id>\d+)/$', 'unko.views.detail'),
    url(r'^polls/(?P<poll_id>\d+)/results/$', 'unko.views.results'),
    url(r'^polls/(?P<poll_id>\d+)/vote/$', 'unko.views.vote'),

次は「/unko/views.py」に見よう。元々からぽけど、先ほどのURLの部分のリダイレクトをカッチする関数を作る必要。以下のviewはindex,detail,vote,resultの四つのviewをを作成した。
その中voteの関数以外全てテンプレートも利用するので後シンプルなテンプレもはっておく。


from django.shortcuts import get_object_or_404, render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from django.template import RequestContext
from unko.models import Poll, Choise

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    t = loader.get_template('polls/index.html')
    c = Context({
        'latest_poll_list': latest_poll_list,
    })
    return HttpResponse(t.render(c))

def detail(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    return render_to_response('polls/detail.html', {'poll': p},
                               context_instance=RequestContext(request))

def vote(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    try:
        selected_choise = p.choise_set.get(pk=request.POST['choise'])
    except (KeyError, Choise.DoesNotExist):
        # Redisplay the poll voting form.
        return render_to_response('polls/detail.html', {
            'poll': p,
            'error_message': "You didn't select a choice.",
        }, context_instance=RequestContext(request))
    else:
        selected_choise.votes += 1
        selected_choise.save()
        return HttpResponseRedirect(reverse('polls.views.results', args=(p.id,)))

def results(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    return render_to_response('polls/results.html', {'poll': p})

テンプレを利用するためtester/settings.pyのTEMPLATE_DIRSに好きなディレクトリを登録して、そのディレクトリの中にpollフォルダをつくって。
pollフォルダのなかに「index.html」を作成する。そのファイルは上のviewsのindexを呼び出す手Mプレになるから、以下ようにする際、あるポールを一覧を表示する。

{% if latest_poll_list %}
    <ul>
    {% for poll in latest_poll_list %}
        <li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

次はdetailed.htmlを以下の通りだと、ポールの選択をラジオボタン付きのフォームで表示する。

<h1>{{ poll.question }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="/polls/{{ poll.id }}/vote/" method="post">
{% csrf_token %}
{% for choise in poll.choise_set.all %}
    <input type="radio" name="choise" id="choise{{ forloop.counter }}" value="{{ choise.id }}" />
    <label for="choise{{ forloop.counter }}">{{ choise.choice }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>


最後のresults.htmlは以下の感じで、ポールの各選択とポイントほ表示する。

<h1>{{ poll.question }}</h1>
<ul>{% for choise in poll.choise_set.all %}    <li>{{ choise.choice }} -- {{ choise.votes }} vote{{ choise.votes|pluralize }}</li>{% endfor %}</ul>
<a href="/polls/{{ poll.id }}/">Vote again?</a>



これよんだら多分分かりにくいけど何とかなるかも。。。。








1 件のコメント:

  1. Mohon ijin berpromosi. service Ac segala jenis merk. kami service Ac mencakup wilayah coverage seluruh Surabaya, Gresik, Sidoarjo. kami juga menerima jasa service perbaikan AC bongkar dan pasang AC. pekerjaan kami cepat, tepat, profesional, harga kompetitif di banding harga jasa luaran.
    service ac split sidoarjo
    tukang service ac sidoarjo
    service ac surabaya sidoarjo
    service ac surabaya selatan
    service ac surabaya timur
    service ac surabaya barat
    service ac surabaya utara
    service ac kota surabaya

    SPLIT-TYPE AIR CONDITIONERS
    MULTI-SPLIT AIR CONDITIONERS
    CHILLED WATER FAN COIL UNITS
    VRF AIR CONDITIONERS
    CHILLERS
    WINDOW-TYPE AIR CONDITIONERS

    http://jualjasaacsurabaya.blogspot.com
    Segera hubungi kami, dan kami akan datang kerumah Anda 24 Jam Non Stop.
    (Hari Sabtu / Minggu / Hari Libur buka)
    PIN BBM : 54BE0B4B / 5474CD93 / TELP : 085645475574

    返信削除