簡體   English   中英

如何在django中搜索帶有url模式的字符串?

[英]How to search a string with the url patterns in django?

我想為每個創建的帳戶創建個人資料頁面。 創建后,可以訪問用戶配置文件

http://example.com/username

但在創建之前,我應該驗證url已經可用,而不是由現有的url模式使用。 例如:會有一個像這樣的頁面

http://example.com/about

現在“約”不是有效用戶。 但它是一個有效的網址模式。 我應該能夠阻止創建名為“約”的用戶。 為此,除了檢查具有該名稱的用戶是否已存在之外,我還需要檢查URL模式。 這該怎么做?

一個簡單的方法是為配置文件頁面提供如下的URL模式: http//example.com/user/username

但我強烈要求擁有如下http://example.com/username的個人資料頁面

您只需嘗試將地址解析為視圖:

from django.core.urlresolvers import resolve
from myapp.views import user_profile_view

try:
    my_view = resolve("/%s/" % user_name)
    if my_view == user_profile_view:
        # We match the user_profile_view, so that's OK.
    else:
        # oops, we have another view that is mapped on that URL
    # you already have something mapped on this address
except:
    # app doesn't have such path

編輯:

您也可以以不同的方式進行檢查:

def user_profile_view(request, user_name):
    # some code here

user_profile_view.name = "User Profile View"

然后上面的檢查可能是:

if getattr(my_view, "name", None) == "User Profile View":
    ...

您可以添加自定義表單字段驗證。 看看這篇文章。 Django和自定義表單驗證

raise forms.ValidationError(u'please choose another username')檢查並引發錯誤。

或者,您可以嘗試為您的用戶設置以下網址,例如:/ user / < example.com/user/<username>/

編輯1: 您可以將其用作所有無效用戶名的列表

我不認為你可以用django.core.urlresolvers.resolve檢查這個。 請注意,它只檢查固定網址的模式,而不是網址的可變部分。 在您的情況下,您很可能將'username'作為傳遞給視圖的變量參數。 此模式也將匹配不存在的用戶名。 所以檢查模式不是很好的解決方案。

更好的方法是將不同命名空間中的靜態頁面或其他頁面分開。 例如http://example.com/static/about

或者您可以為您的網站預定義關鍵字/保留字,例如[“about”,...],並在創建用戶時根據用戶名進行檢查。

將您的用戶名視圖放在urls.py的末尾,以便首先檢查其他網址規則。

然后最簡單的方法是獲得一個無效用戶名列表,該列表應該在用戶注冊驗證中使用。

def clean_username(self):
    INVALID_USERNAMES = ('about', 'admin', 'register', '...')

    username = self.cleaned_data['username']
    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        pass
    else:
        raise forms.ValidationError(u'%s already exists' % username )

    if username in INVALID_USERNAMES:
        raise forms.ValidationError(u'%s is not a valid username' % username )

    return username

首先,用戶名的網址規則:

url(r'^(?P<username>[-\w]+)/$', 'membership.views.profile', name='profile'),

確保用戶名與現有網址規則不沖突有點困難。

我通常處理這個問題的方法是為url添加唯一性:

url(r'^user/(?P<username>[-\w]+)/$', 'membership.views.profile', name='profile'),

如果您必須使用用戶名創建配置文件的url,那么您可以嘗試使用類似這樣的方法來搜索URL: https//stackoverflow.com/a/2094270/884453然后確保用戶名都是唯一的針對其他用戶名和路由

編輯

正如我在寫這篇文章時,有人發布了一個很好的想法,一個驗證器使一堆更有意義。

使用from django.core.urlresolvers import resolve來檢查它的唯一性是一個很好的解決方案

from django.core.exceptions import ValidationError
from django.core.urlresolvers import resolve

def validate_unique_resolve(value):
    urlroute = True
    try:
        urlroute = resolve(path, urlconf)
    except urlresolvers.Resolver404:
        urlroute = False

    if urlroute != False :
        raise ValidationError(u'%s is a reserved url pattern' % value)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM