2

私はいくつかのグーグルを行いましたが、これに対する答えが本当に見つかりませんでした。

次の単純なクラスがあるとしましょう。

class dashboard:
    def index(self, request):
        return HttpResponse("Hello world")

    def profile(self, request):
        return HttpResponse("Your profile")

    def user(self, request, user_id):
        usr = User.objects.get(id=user_id)
        return HttpResponse("Some info on usr")

私がやりたいのはマップです:

mysite.com/dashboard => dashboard.index

mysite.com/dashboard/profile => dashboard.profile

mysite.com/dashboard/user/1 => dashboard.user(1)

各 URL の URL パターンを持たなくても、次のようになります。

urlpatterns = patterns('',
    url(r'^/dashboard$', views.dashboard, name='dashboard'),
    url(r'^/dashboard/profile$', views.profile, name='profile'),
    # etc...
)

私はこれについて考えましたが、これが機能すると私が考えることができるのは次のとおりです。

urlpatterns = patterns('',
    url(r'^/(?<root1>\w+)/(?<root2>\w+)/(?<root3>)$', urltrigger, name='trigger'),
    # etc...
)

# https://stackoverflow.com/questions/547829/how-to-dynamically-load-a-python-class
def my_import(name):
    mod = __import__(name)
    components = name.split('.')
    for comp in components[1:]:
        mod = getattr(mod, comp)
    return mod

def urltrigger(request, root1, root2 = None, root3 = None):
    try:
        cmodule = my_import(root1)
        dync = cmodule() # perhaps request is a parameter to the constructor?
        if root2 = None:
            dync.index(request)
        else:
            method = getattr(dync, root2)
            if root3 == None:
                method()
            else:
                method(root3)
    except:
        raise Http404

(すばやく実行された Python コードで申し訳ありません) クラス モジュールは pythonpath に存在する必要があるため、これによってセキュリティ上の問題が発生することはありません。また、攻撃者が pythonpath 内のファイルにアクセスできる場合は、他のビュー/コードを簡単に変更できます。

誰もこれについて何か考えがありますか?このアプローチを使用すると、おそらく Django デコレーターを使用できなくなる可能性があります。クラスのコンストラクタ。

編集:

私はそれをすべて機能させました-それはたった10行のコードのようなものでした.

編集2:

不思議に思っている人のために:

これをパターンとして入れます:

(r'^(.+?)/(?:(.+?)/)?$', free_pattern)

そして、ここに free_pattern があります (それ以来、私は明らかにそれを変更しました):

def free_pattern(request, view, segments=""):
    if segments != None:
        segments = segments.split(r'/')

    match = re.match("(\.|\\|/)", view)
    if match:
        raise Http404

    dnyc = None
    try:
        if not segments:

            cmodule = __import__(view + ".controllers." + view, globals(), locals(), [view], -1)
            dnyc = getattr(cmodule, view)

        else:
            cmodule = __import__(view + ".controllers." + segments[0], globals(), locals(), [segments[0]], -1)
            dnyc = getattr(cmodule, segments[0])
    except Exception, e:
        return HttpResponse(str(e))

    c = dnyc(request)
    if segments == None or len(segments) == 1:
        return c.index()
    else:
        lst = segments[2:]
        return getattr(c, segments[1])(*lst)

/site/ に移動すると、site/controllers/site.py のクラス サイトが読み込まれ、index メソッドが呼び出されます。

class site:
    def __init__(self, request):
        pass # do something with request
    def index(self):
        pass

/site/page に移動すると、site/controllers/page.py のクラス ページが読み込まれ、index メソッドが呼び出されます。/site/page/one に移動すると、クラス ページの one メソッドが呼び出され、最後に /site/page/one/1/ に移動すると、1 (およびそれ以降のすべて) がパラメーターとしてメソッドにパラメーターとして渡されます。

これが機能しないと思われる場合は、「サポートしなくてよかった」ではなく、その理由を教えてください。後者は私を助けず、他の人を助けず、そのようなシステムが機能しない理由を説明しません. 私の意見では、コメントだけでは答えられません。

virtualenv/pip/easy_install なしで Python 2.5 を使用する必要があるため、私は Django 1.4 に固執しています。私は本当にそうしたいのですが、交渉の余地はありません。これは私の「個人的な」使用だけではないため、Webホストを切り替えることも問題外です.

私が注意したいことの1つは、公式のDjango CBVを使用すると、login_requriedなどのDjangoデコレータを適用できないなど、同じ問題(セキュリティを無視する)を導入することだけです。回避策については、この SO 投稿 ( https://stackoverflow.com/a/11525851/195722 ) を参照してください。

4

0 に答える 0