1. 程式人生 > >Django 框架之 URL

Django 框架之 URL

ren orm 映射 可選 pos localhost OS 網站 special

  • URL配置就像Django所支撐網站的目錄。它的本質是URL模式以及要為該URL模式調用的視圖函數之間的映射表。
# 示例:
urlpatterns = [
    path(route, view, kwargs=None, name=None),

    re_path(正則表達式, views視圖函數, 參數, 別名),
]
# 參數說明:
#   一個正則表達式字符串
#   一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串
#   可選的要傳遞給視圖函數的默認參數(字典形式)
#   一個可選的name參數


# 示例一:
# mysite/mysite/urls.py
from django.urls import path, re_path
from blog import views

urlpatterns = [
    path('cur_time', views.cur_time),
    path('userInfo', views.userInfo),

    re_path(r'^articles/2003/$', views.special_case_2003),
    re_path(r'^articles/([0-9]{4})/$', views.year_archive)
    re_path(r'^articles/([0-9]{4})/([0-9]{2})/', views.month_archive)
]

# mysite/blog/views.py
def special_case_2003(req):
    return HttpResponse('2003')

def year_archive(req, y):       # 參數y接收: ([0-9]{4}) 傳入的值
    return HttpResponse('year':y)   

def month_archive(req, y, m):
    return HttpResponse('year:'+y+'month:'+m)    # 參數y接收: ([0-9]{4}) 傳入的值, m 接收([0-9]{2})


# 示例二: Named groups

# 預備知識: 正則表達式
import re

ret = re.search('(?P<id>\d{3})/(?P<name>\w{3})', 'wwwwwfffttt555/ooo')

print(ret.group())          # 輸出: 555/ooo
print(ret.group('id'))      # 輸出: 555
print(ret.group('name'))    # 輸出: ooo

# mysite/mysite/urls.py
from django.urls import path, re_path
from blog import views

urlpatterns = [
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.month_archive)
]

# mysite/blog/views.py
def month_archive(req, year, month):           # 此處形參必須為 year,month
    return HttpResponse('year:'+year+'month:'+month)    


# 示例三:
# mysite/mysite/urls.py
from django.urls import path, re_path
from blog import views

urlpatterns = [
    re_path(r'^index/(?P<name>[0-9]{4})/', views.index, {'name':'xiaohu'})
]

# mysite/blog/views.py
def index(req, name):           # 此處形參必須為 name
    return HttpResponse(name)           # 參數 {'name':'xiaohu'} 會覆蓋URL中的參數


# 示例四:
# mysite/mysite/urls.py
from django.urls import path, re_path
from blog import views

urlpatterns = [
    re_path(r'^index/', views.index, name='book')    # name表示URL的別名
    re_path(r'^/movie/index/', views.index, name='book')
]

# mysite/blog/views.py
def index(req):          
    if req.method=='POST':
        username=req.POST.get('username')
        pwd=req.POST.get('pwd')
        if username=='xiaohu' and pwd=='123':
            return HttpResponse('登錄成功!')

    return render(req, 'login.html')

# mysite/templates/login.html
<body>
    <!-- 相比於 action='/index/', URL地址更靈活 --
    <form action="{% url 'book' %}" method="post">
        <input type="text" name="username">
        <input type="password" name="pwd">
        <input type="submit" value="submit">
    </form>
</body>

# 訪問地址:
http://localhost:8080/index
http://localhost:8080/movie/index


參考資料

  • Python 全棧

Django 框架之 URL