2010-08-10 62 views
1

我有一個模型需要存儲將成爲Django環境一部分的URL。如果我存儲的是正常的URL,我會使用models.URLField,並使用verify_exists來確保URL實際存在。Django和測試本地URL存在

但是,這在開發中並沒有那麼好,因爲dev服務器是單線程的,它無限期掛起,因爲它不能一次處理兩個請求。

我希望做使用resolve()東西,但我有困難,在那個文檔頁面的版本,這並不需要一個請求結束調整功能myview,因爲我要檢查一個給定的本地URL可以從空白會話中解決,並沒有404被提出。

我希望用validator,像這樣的事情要做到這一點:

def validate_local_url(value): 
    try: 
     view, args, kwargs = resolve(value) 
     view(*args, **kwargs) 
    except Resolver404: 
     raise ValidationError(u'%s is not a local URL (not a valid URL)' % value) 
    except Http404: 
     raise ValidationError(u'%s is not a local URL (does not exist)' % value) 

然而,如果沒有一個有效的request對象被傳遞到kwargs失敗。如何生成虛擬(空白)請求對象?我試過只用django.http.HttpRequest

+0

你想成爲多嚴密?你是否想讓鏈接到一個丟失或刪除的記錄是不可能的,或者你只是想確保它與你的應用中的某個視圖相匹配? – 2010-08-10 17:06:18

+0

@Jordan - 我想確保它與某些觀點相符,並且將'resolve'數字傳遞給視圖的參數不會引發'Http404'。 – 2010-08-10 17:21:03

回答

0

只是一個瘋狂的想法,不知道它是否會有所幫助。你有沒有考慮命名的網址和使用reverse()?如果URL有效,則Reverse將起作用,否則將失敗。

+0

我不知道如何讓這個工作 - 用戶需要知道視圖的名稱以及他們如何獲取參數。 – 2010-08-10 17:21:28

0

你是不是很喜歡使用django test Client

如果是這樣,應該這樣做:

from django.test.client import Client 

def validate_local_url(path): 
    c = Client() 
    try: 
     resp = c.get(path) 
     if resp.status_code == 404: 
      raise ValidationError(u'%s is not a local URL (does not exist)' % value) 
    except: 
     raise ValidationError(u'%s is not a local URL (not a valid URL)' % value) 

只是,你知道的,請務必在判處死刑是validate_local_url可以從未由當地GET要求而召開的,否則有人可以平凡設定服務器上的無限循環:

# urls.py 
url('^infinite_loop/$', 'myapp.infinite_loop', 'infinite_loop') 

#views.py 
def infinite_loop_view(request, template_name="blah.html", form_class=MyForm): 
    my_form = form_class(request.REQUEST or None) # yes, admittedly this is dumb 
    if my_form.is_valid(): 
     return HttpResponse("Congratulations! Your path was totally valid.") 
    return render_to_response(template_name, locals(), RequestContext(request)) 

然後:

http://example.com/infinite_loop/?path_field=infinite_loop

+0

雖然我想即使這樣也沒關係,因爲第二次調用不會發送路徑變量,對吧? 即便如此,我也會對這個決定保持警惕。就我個人而言,我會滿足於確保他們創建了一個指向有效URL的本地URL(即不會引發Resolver404)並接受偶爾的404。 – 2010-08-10 18:20:24