スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[python]Djangoチュートリアルを読んで

djangoチュートリアルを読んだのでまとめます。
詳しく知りたい方は、本家を参照ください。

前回の記事にて、eclipseにてdjangoの環境を整えたので、
eclipseによる開発手順をまとめます。
開発環境構築については、前回の記事を参照ください。(Macですが、、、)

基本的な流れ
1.プロジェクト作成
2.データベース設定
3.アプリケーション作成
4.データベース作成
5.ビューの作成

となっており、MVCアプリケーションのモデルをベースとした
アプリケーション作成を行います。


プロジェクトの作成

こちらに関しても前回の記事を参照してください。
[作られるファイル]
・manage.py (main文とかが書かれる)
・settings.py (各種セッティングをする)
・urls.py (URLスキームの設定)

*備考 port番号を変更したい場合は、引数にポート番号を与えます。




データベースの設定

setting.pyにて行います。

DATABASES データベースの設定をします。
 ENGIN データベースを定義します。
     sqlite3の場合 : 'django.db.backends.sqlite3'
 NAME  データベース名を設定します。
     sqliteの場合は、絶対パスを入れます。(*ここ重要!!)
     'NAME': '[データベース格納ディレクトリ]/sqlite.db',
 DATABASE_USER データベースユーザ名
 DATABASE_PASSOWRD データベースパスワード
 DATABASE_HOST データベースがあるサーバホスト。同マシン上では空文字。


setting.pyを設定後

python manage.py syncdb


を行い、データベースを作成します。




アプリケーションの作成

以下のコマンドでアプリケーションを作成します。

python manage.py startapp [アプリケーション名]


[作られるファイル]
・アプリケーションディレクトリ
・models.py
・views.py
・__init__.py
・tests.py
ここでよく弄るのは、models.pyとviews.pyです。
models.pyは、データベース制御(O/Rマッパ)を定義します。
views.pyは、リクエストに対してどのように対応するかを定義します。




データベース作成

models.pyにテーブル、カラムを定義します。
テーブルはクラス、カラムはメンバ変数となります。
その他、データ制御はクラス内の変数で定義します。

models.png


models.pyを有効にするためには、settings.pyの
INSTALLED_APPSにより設定します。
(例)

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'mysite.polls'
)



上記設定後、

python manage.py syncdb


にてデータベースを作成します。




ビューの作成

ビューは、views.py内で定義しますが、
リクエストurlとviewの関連付けは、urls.pyにて行います。

urls.py
(正規表現、呼び出す関数)


のタプルで定義します。
urls.png

また、呼び出す関数への引数はurls.pyで定義された変数と同等名に指定します。
(画面の関係でサムネイルだけ表示します)
url2.png


urls.pyにて定義されたurlからのリクエストに対して、
レスポンスをviews.pyにて書きます。
レスンポンスを返す際はhtml等を返さなければいけませんが、
pythonコードにhtmlを書くのは非常に効率が悪いため、temlateというものが
用意されています。
template機能を用いると、テンプレートに用意した変数に、プログラムから
値を代入し、簡単に動的なhtml等を作成するとこができます。
以下に、templateの例を挙げます。(チュートリアルのコピペ)

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



基本的に{%...%}内は、pythonコードです。
変数のみの場合は、{{...}}を使います。
テンプレートは、settings.pyのTEMPLATE_DIRSにて定義します。
TEMPLATE_DIRSでは、テンプレートを格納しているルートディレクトリを設定します。

処理の流れをまとめると、

リクエスト→urls.pyを検索→views.pyを実行しtemplateに代入→リクエストを返す


みたいな感じです。

次にチュートリアルで紹介があったライブラリ関数を書きます。
以下のライブラリを押さえていればある程度のことはできます。
HttpResponse(返すオブジェクト)
 HttpResponseでは、リクエストに対するレスポンスを返します。
render_to_response(テンプレートパス,辞書オブジェクト) 
 テンプレートに簡単に入れて、レスポンスを返してくれます。
 テンプレートパスは、TEMPLATE_DIRSにて設定されたルートディレクトリからのパスです。
get_object_or_404(モデル名、取得条件)
 モデルから取得条件に従って値を取得します。
 もし見つからなかった場合は、404オブジェクトを返します。
 利点はHttp404のエラー処理を実装しなくていい事です。
reverse(関数名,引数)
 他の関数へのurlを作成します。
HttpResponseRedirect(他のurl)
 reverse関数等で作成したurlに対して、httpリダイレクトをします。




その他

最後に、チュートリアル通にやっていもなかなか動いてくれません。
ですので、チュートリアルをやる際に役立った事を書きます。
・対話API
データベースを操作する対話型APIです。

python manage.py shell


にて起動します。
pythonにてモデルを操作できますので、非常に簡単にデータエントリーができます。
以下にチュートリアルのモデル登録例を書きます。

In [1]: from mysite.polls.models import Poll,Choice
In [2]: import datetime
In [3]: p = Poll(question="What's up?" , pub_date=datetime.datetime.now())
In [4]: p.save()
In [5]: c = Choice(poll=p,choice="you're kidding",votes=0)
In [6]: c.save()



・CSRFについて
リダイレクトをしようとすると、以下のようなエラーが発生します。

"Forbidden(403) CSRF verification failed. Request aborted."


これは、DjangoがCSRF対策に行っているためです。
ですので、settings.pyのMIDDLEWARE_CLASSESに以下を追加登録してください。

'django.middleware.csrf.CsrfResponseMiddleware'




以上です、
これでDjangoの基本は押さえられたと思います。

おわり。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

[python]Macでmod_wsgiの動作環境を確かめてみる。

先日書いたmod_wsgiの動作環境構築の記事。

envrionの中はどうなってるんだろう??と思い、environの中身をhtml出力するコードを書いてみました。

環境
プロセッサ 1.7 GHz Intel Core i5
ソフトウェア Mac OS X Lion 10.7.2(11C74)
Server version Apache/2.2.20 (Unix)
python version 2.6


#-*- coding:utf-8 -*-
header = """
<html>
<head><title> environ list</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
</head>
<body>
"""
footer = """
</body></html>
"""
def application(environ , start_response):
start_response('200 OK',[('Content-Type','text/html')])

body = "<h3> environのkey-value リスト</h3>"
body += "<table border = 1>"
table = "<tr><td>%s</td><td>%s</td></tr>"
body += table % ("<b>key</b>" , "<b>value</b>")
for key , val in environ.iteritems():
body += table % (key, val or 'Empty')
body += "</table>"
return header + body + footer

from wsgiref.simple_server import make_server
make_server('',8080,application).serve_forever()


このコードは、pythonで動かすモードです。
apacheで動かすモードに変更するときは、下2行の
from wsgiref.simple_server import make_server
make_server('',8080,application).serve_forever()
を削除してください。



テーマ : ソフトウェア開発
ジャンル : コンピュータ

[python]Macでmod_wsgiを動かしてみる。

pythonのwebアプリケーションフレームワークで使用されているwsgi。
Djangoとか適当に使えば、なんとなく使えるのだろうけど、
その前に、wsgiとはなんぞや?
と気になったので、mod_wsgiを動かしてみた。

使ってみると、結構これだけでwebアプリケーション作れるんじゃ無いか?
と思ったので、使い方(Helloworldレベル)を書き残しておきます。
(結構長文になる予感orz)

環境
プロセッサ 1.7 GHz Intel Core i5
ソフトウェア Mac OS X Lion 10.7.2(11C74)
Server version Apache/2.2.20 (Unix)
python version 2.6



wsgiのインストール

まずは、portsでwsgiをインストールします。
portsの使い方は、過去の記事を参照。
portsを使うとapacheやpython26が入っていない人も勝手にインストールされると思います。

$ sudo port install mod_wsgi -python26
・・・(中略)・・・
---> Verifying checksum(s) for mod_wsgi
---> Extracting mod_wsgi
---> Configuring mod_wsgi
---> Building mod_wsgi
---> Staging mod_wsgi into destroot
Warning: mod_wsgi installs files outside the common directory structure.
---> Installing mod_wsgi @3.3_0+python26
########################################
# To enable mod_wsgi add
# LoadModule wsgi_module modules/mod_wsgi.so
# to your apache2 config file:
# /opt/local/apache2/conf/httpd.conf
########################################
---> Activating mod_wsgi @3.3_0+python26
---> Cleaning mod_wsgi


と、あっさり完了。
ここで、今回インストールされたのは、
mod_wsgi3.3.0
です。


apacheの設定

$ sudo vi /opt/local/apache2/conf/httpd.conf


にて、httpd.confにて、mod_wsgiの設定とhttpd-userdir.confをincludeするように設定します。
今回は、~/Site以下にてapache動作できるようにします。
以下を追加、コメントアウトします。

LoadModule wsgi_module modules/mod_wsgi.so

# User home directories
Include conf/extra/httpd-userdir.conf


次に

$ sudo vi /opt/local/apache2/conf/extra/httpd-userdir.conf


とし、httpd-userdir.confを変更しwsgiを設定します。
以下を<Directory "/Users/*/Sites">タグ内に記入します。

## mod_wsgi
Options Indexes FollowSymLinks ExecCGI
SetHandler wsgi-script
AddHandler wsgi-script .wsgi
AddHandler wsgi-script .py


これで、apacheにてwsgiの動作が可能となります。



wsgiの動作

wsgiを動作させるには、2種類の方法があります。
1.pythonで動作
2.apacheで動作


私もこれを発見(?)するのに結構かかりましたので、両方書きます。
今回は、以下のサンプルコードを使います。
testwsgi.py

def hellowsgi(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain')])
print "Debug test #1" # デバック用
return 'Its works by mod_wsgi!'

from wsgiref.simple_server import make_server
make_server('', 8080, hellowsgi).serve_forever()

def hellowsgi内
environは、辞書型でクライアントからのリクエスト情報が入っています。
environ Variablesを参考ください。
start_responseは、httpレスポンスです。ステータスコードやヘッダを入れます。
そして、レスポンス内容を返します。

その他
ある意味main文。(じゃぁ、main文書けよって話ですが、面倒くさいので、、、)
make_serverにてサーバを作って、レスポンスを返す関数を与えています。
serve_forever()は、死ぬまで一生続けるよ、って関数です。


1.pythonで動作
まずは、先ほど示したtestwsgi.pyを~/Site内にtestwsgi.pyにて保存します。
pythonでの動作はpythonが実行できるディレクトリであれば何処でもよいのですが、
次に紹介するapacheの動作にてSite内でなければ動作しませんのでSite内にしました。
(おそらくSite内は、Pythonも実行できると思う、、、)

$ python testwsgi.py


を実行し、testwsgi.pyを動かします。
次に任意のブラウザにて、
http://localhost:8080/
にアクセスします。ここで、実行したpythonモジュールが実行されます。
It works by mod_wsgi!
と表示されたら成功です。
また、コンソール出力に

Debug Line #1
1.0.0.127.in-addr.arpa - - [30/Nov/2011 17:32:34] "GET / HTTP/1.1" 200 21
Debug Line #1
1.0.0.127.in-addr.arpa - - [30/Nov/2011 17:32:34] "GET /favicon.ico HTTP/1.1" 200 21


と表示されます。
ここでは、httpリクエストと、任意の標準出力、エラーが出力されます。
よって、簡単なデバックはprint等を使って行う事ができます。
終了は、ctrl+Cです。


2.apacheでの確認
1にて、Site内にファイルを保存したと思いますので、そのまま実行します。
apacheを動作します。

$ sudo vi /opt/local/apache2/bin/apachectl start


次に、ブラウザにて、次のurlを打ち込みます。
http://localhost/~[ユーザ名]/testwsgi.py
エラーが出てきたと思います。
これは、pythonで実行したコードをapacheを通すと実行できない事を示しています。
では、apache用にコードを変更します。

まずは、要らないコード

from wsgiref.simple_server import make_server
make_server('', 8080, hellowsgi).serve_forever()

を削除します。apacheからアクセスする場合は、実行(main文)は必要ありません。
そうすると、def文を呼び出すものがなくなってしまいます。
どこから呼び出すのか?
ここに書いてありました。
Configuration Guidelines
application関数を勝手に呼び出すようです。
よって、hellowsgiの関数名をapplicationに変更します。
最終的に以下のようなコードになります。

def application(environ , start_response):
print "Debug Line #1"
start_response('200 OK',[('Content-Type','text/plain')])
return 'It works by mod_wsgi!'


再度、ブラウザにアクセスすると正常に表示されたと思います。
また、エラーや標準出力は、apacheのエラーログに出力されます。
httpd.confのErrorLogを確認してみて下さい。

と、このような形でwsgiの基本動作をやってみましたが、
これを理解してDjango等に取り組むと、もっと面白い開発ができるのではないか?
と思いました。

また、探しているとこんな記事がありました。
WSGIとPythonでスマートなWebアプリケーション開発を
よく書いてありますので、他のアプリケーションも試してみるといいと思います。

おわり。

テーマ : ソフトウェア開発
ジャンル : コンピュータ

[python]pythonのコードをhtml化してくれるスクリプト

pythonのコードをブログ上でアップするとき、htmlに変換してくれないかなぁと思い調べて見ました。

つちのこ、のこのこ。

pythonで書かれていて、引数にhtml変換するファイルパスを与えます。

簡単っすね。(中身は見ていないけど。。。)

みんなどうやってるんだろうなぁ。


-- 追記 --
やっぱり、他の方法があった。。。

SyntaxHighliteってのがあるみたい。
でもこれって、表示遅いよね。。。
参考
【FC2】SyntaxHighlighter 3.0.83 導入編 -1-



テーマ : ソフトウェア開発
ジャンル : コンピュータ

[Python] Exif情報をCSVに保存

pythonを使って、Exif情報を取得しようと思い、調べたら簡単にできることがわかりました。
まぁるいしっぽ

要は、
PILの_getexif()を使ってexif情報のディクショナリを取得し、get(キー)にて情報を取得するとのこと。
キーなんて覚えてねぇよ!ってみんな思うので、ExifTags.TAGSから取ってくる事ができる
という感じかな(・∀・)

そこで、Windowsのフォルダ内のjpegファイルの情報をCSVファイルに吐き出すスクリプトを書いたので、残します。


def saveExifTags(dirpath,csvpath):
# ディレクトリ内のexifのタグを"csvpath"のCSVにて保存します
import Image
import ExifTags
import glob
import csv
flist = glob.glob(dirpath + "\\*.JPG")
wcsv = csv.writer(file(csvpath,'w'),lineterminator="\n")

# header
header =[]
for tag in ExifTags.TAGS.items():
header.append(tag[1])
wcsv.writerow(header)

# exif file value
for f in flist:
exif = Image.open(f)._getexif()
csvrow = []
for tag in ExifTags.TAGS.items():
val = exif.get(tag[0])
if val == None:
csvrow.append("None")
else:
csvrow.append(str(val))
wcsv.writerow(csvrow)
del wcsv


とこんな感じです。
引数は、フォルダパスとcsv保存パスです。

GPSには対応していません。

おわり。

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

ss_9

名前 :ss_9
紹介 :
20代はエンジニア、30代はプロ、40代は管理、50代は人脈。

Twitterボタン

最新記事
カテゴリ
AD
月別アーカイブ
RSSリンクの表示
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。