Django - Ánh xạ URL

Bây giờ chúng ta có một khung nhìn làm việc như đã giải thích trong các chương trước. Chúng tôi muốn truy cập chế độ xem đó thông qua một URL. Django có cách riêng để lập bản đồ URL và nó được thực hiện bằng cách chỉnh sửa tệp url.py dự án của bạn(myproject/url.py). Tệp url.py trông giống như -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
)

Khi người dùng đưa ra yêu cầu cho một trang trên ứng dụng web của bạn, bộ điều khiển Django sẽ tìm kiếm chế độ xem tương ứng qua tệp url.py, sau đó trả về phản hồi HTML hoặc lỗi 404 not found, nếu không tìm thấy. Trong url.py, điều quan trọng nhất là"urlpatterns"tuple. Đó là nơi bạn xác định ánh xạ giữa các URL và chế độ xem. Ánh xạ là một bộ trong các mẫu URL như -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)

Dòng được đánh dấu ánh xạ URL "/ home" đến dạng xem hello được tạo trong tệp myapp / view.py. Như bạn có thể thấy ở trên, một ánh xạ bao gồm ba yếu tố:

  • The pattern- Một regexp phù hợp với URL bạn muốn được giải quyết và ánh xạ. Mọi thứ có thể hoạt động với mô-đun python 're' đều đủ điều kiện cho mẫu (hữu ích khi bạn muốn chuyển các tham số qua url).

  • The python path to the view - Giống như khi bạn đang nhập một mô-đun.

  • The name- Để thực hiện đảo ngược URL, bạn sẽ cần sử dụng các mẫu URL được đặt tên như được thực hiện trong các ví dụ trên. Sau khi hoàn tất, chỉ cần khởi động máy chủ để truy cập chế độ xem của bạn qua: http: //127.0.0.1/hello

Tổ chức URL của bạn

Cho đến nay, chúng tôi đã tạo các URL trong tệp “myprojects / url.py”, tuy nhiên như đã nêu trước đó về Django và tạo ứng dụng, điểm tốt nhất là có thể sử dụng lại các ứng dụng trong các dự án khác nhau. Bạn có thể dễ dàng thấy vấn đề là gì, nếu bạn đang lưu tất cả các URL của mình trong tệp “projecturl.py”. Vì vậy, phương pháp hay nhất là tạo một “url.py” cho mỗi ứng dụng và đưa nó vào tệp url.py dự án chính của chúng tôi (chúng tôi đã bao gồm URL quản trị viên cho giao diện quản trị trước đây).

Làm thế nào là nó Hoàn thành?

Chúng tôi cần tạo tệp url.py trong myapp bằng mã sau:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)

Sau đó, myproject / url.py sẽ thay đổi thành như sau:

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^myapp/', include('myapp.urls')),
)

Chúng tôi đã bao gồm tất cả các URL từ ứng dụng myapp. Home.html được truy cập thông qua “/ hello” giờ là “/ myapp / hello”, là một cấu trúc tốt hơn và dễ hiểu hơn cho ứng dụng web.

Bây giờ, hãy tưởng tượng chúng ta có một chế độ xem khác trong myapp “morning” và chúng ta muốn ánh xạ nó trong myapp / url.py, sau đó chúng ta sẽ thay đổi myapp / url.py thành -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
   url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)

Điều này có thể được tính lại thành -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),)

Như bạn có thể thấy, bây giờ chúng tôi sử dụng phần tử đầu tiên của urlpatternstuple. Điều này có thể hữu ích khi bạn muốn thay đổi tên ứng dụng của mình.

Gửi các tham số đến các chế độ xem

Bây giờ chúng ta đã biết cách ánh xạ URL, cách tổ chức chúng, bây giờ chúng ta hãy xem làm thế nào để gửi tham số đến các khung nhìn. Một ví dụ điển hình là ví dụ bài viết (bạn muốn truy cập một bài báo qua “/ posts / article_id”).

Việc chuyển các tham số được thực hiện bằng cách chụp chúng với regexptrong mẫu URL. Nếu chúng ta có một chế độ xem như sau trong “myapp / view.py”

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

Chúng tôi muốn ánh xạ nó trong myapp / url.py để chúng tôi có thể truy cập nó qua “/ myapp / article / articleId”, chúng tôi cần những thứ sau trong “myapp / url.py” -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)

Khi Django nhìn thấy url: “/ myapp / article / 42”, nó sẽ chuyển các tham số '42' đến chế độ xem viewArticle và trong trình duyệt của bạn, bạn sẽ nhận được kết quả sau:

Lưu ý rằng thứ tự của các tham số là quan trọng ở đây. Giả sử chúng ta muốn danh sách các bài báo của một tháng trong năm, hãy thêm chế độ xem viewArticles. View.py của chúng tôi trở thành -

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

def viewArticle(request, month, year):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

Tương ứng url.py tệp sẽ giống như -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)

Bây giờ khi bạn truy cập “/ myapp / Articles / 12/2006 /”, bạn sẽ nhận được 'Hiển thị các bài báo của: 2006/12' nhưng nếu bạn đảo ngược các tham số, bạn sẽ không nhận được kết quả tương tự.

Để tránh điều đó, có thể liên kết tham số URL với tham số chế độ xem. Vì vậy, của chúng tôiurl.py sẽ trở thành -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)