2009-09-25
作成できないアプリケーション名
↓これでエラーが出た
> python manage.py startapp user
エラーメッセージはこれ↓
Error: 'user' conflicts with the name of an existing Python module and cannot be used as an app name. Please try another name.
既に user ってモジュールあるもんね。そりゃーだめさ。
URLから実行するモジュールを判断して実行させたい
やりたかったことは2点。
- django & python で動的にモジュールを呼び出す
- python で可変引数を受け付ける関数を実現
というわけで「http://localhost:8000/api/image/set/」で「img/views.py の set()」が、「http://localhost:8000/api/image/own/list/」で「img/views.py の list()」が動作するようになるまでを。
(ownてのは後々、自分の画像って意味で使用したいから)
- 「python manage.py startapp api」で api アプリケーションを作成
- 「python manage.py startapp img」で img アプリケーションを作成
- settings.py
# INSTALLED_APPS に以下を追記 'api',
- urls.py
urlpatterns = auth_patterns + patterns('',
('^admin/(.*)', admin.site.root),
(r'^$', 'django.views.generic.simple.direct_to_template',
{'template': 'main.html'}),
(r'^api/', include('api.urls') ), # コレを追記
# Override the default registration form
url(r'^account/register/$', 'registration.views.register',
kwargs={'form_class': UserRegistrationForm},
name='registration_register'),
) + urlpatterns
- api/urls.py(新規作成)
# -*- coding: utf-8 -*- from django.conf.urls.defaults import * urlpatterns = patterns( 'api.views' ,(r'(?P<path_info>.*)', 'action') )
- api/views.py
# -*- coding: utf-8 -*- from django.http import HttpResponse def action(request, path_info): path_list = path_info.split('/') module_name = getModuleName(path_list) + '.views' method_name = getMethodName(path_list) if hasattr(__import__(module_name).views , method_name): app = __import__(module_name) module = getattr(app.views, method_name) return module(request, {'path_list':path_list}) return HttpResponse('実行するアプリケーションまたはメソッドが無い') def getModuleName(path_list): modules = { 'default' : 'index' , 'image' : 'img' } if modules.has_key(path_list[1]): return modules[path_list[1]] elif path_list[2] is not None and path_list[2] != '' and modules.has_key(path_list[2]): return modules[path_list[2]] else: return modules['default'] def getMethodName(path_list): if path_list[len(path_list)-1] != '' : name = path_list[len(path_list)-1] else: name = path_list[len(path_list)-2] return name
- img/views.py
# -*- coding: utf-8 -*- from django.http import HttpResponse def index(*data): print 'img - default' return HttpResponse(None) def set(*data): print 'img - set' for val in data: print type(val) print val return HttpResponse(None) def list(*data): print 'img - list' for val in data: print type(val) print val return HttpResponse(None)
というわけで、動かしたいように動いてはくれた。
- インポートする際に imp っていうモジュールもあるらしいけど __import__ 使ったほうがよさげ。具体的にどこがいいかはまだ不明。
- 「(r'(?P<path_info>.*)', 'action')」この「<path_info>」を「<text>」にすると「def action(request, text)」とできる。ふむ、何でもいいのか。
- 関数を作るとき、引数に「*」を付けると、全てをタプル型として格納して受け取れる状態にしてくれる。
- 引数に「**」を付けると、仮引数に対応していない引数を格納してくれるらしい。これはいつかテストする。
以下は参考
- Python: 可変個の引数を受け取る関数 - Yukun’s Blog
- Pythonの楽しいところ2 - 東大の近くでEラーニングやってる社長のブログ
- すぐに忘れる脳みそのためのメモ: Python の可変引数
記載が雑だなあ…とは思います。