PATH_INFO を使ってメソッドを指定して実行
http://hogehoge.com/dinamic/aaaaa というURLでアクセスした際に、aaaaa() というメソッドを実行させたい!という場合
urls.py
# -*- coding: utf-8 -*- from django.conf.urls.defaults import * urlpatterns = patterns( 'dinamic.views' ,(r'^$', 'index') ,(r'^[a-zA-Z0-9]{1,}', 'index') )
view.py
# -*- coding: utf-8 -*- from django.http import HttpResponse # os.environ を利用して PATH_INFO 取得 import os # funcs.py は views.py と同じディレクトリ内に設置した # 別にどこにおいてあっても構わない import funcs def index(request): func_name = getFuncNameStringsByPathInfo() func_name_list = dir(funcs) if len(func_name_list) == 0: result = '関数が無い' elif hasFuncName(func_name, func_name_list) == False : result = 'メソッドが無い' else: method = getattr(funcs, func_name) result = method() return HttpResponse(result, mimetype='text/plain') def getFuncNameStringsByPathInfo(): if os.environ.has_key('PATH_INFO'): if os.environ['PATH_INFO'] != '': path_info = os.environ['PATH_INFO'].split('/') func_name = path_info[2:3] func_name = func_name[0] return func_name return None def hasFuncName(text, funcs_list): if not isinstance(text, str): return False if text == '': return False if not funcs_list.index(text): return False return True
funcs.py
# -*- coding: utf-8 -*- def aaaaa(): return "イェアイェア" def abced(): return "abc"
これでできた。しかし views.py のメソッド名探す箇所はなんとかしないと…
(追記) ここまでで無駄に長くなったので短くしたのがこちら。