Django(靜態文件or路由)


 

 

 

靜態文件

在開發中同創會使用到 css,js,img等靜態文件,這里帶大家簡單的介紹一下django如何處理靜態頁面,

配置 setting.py文件

STATIC_URL = '/static/' #這里相當於別名
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'myapp/static'), #靜態文件的真是路徑
]

說明:

配置url地址,當我們要訪問靜態文件時url地址,這里只是做其中一部分path,結合urlconf會詳細說明;

    • STATIC_ROOT: 
      配置靜態文件存放目錄,如上代碼所示即在工程的static目錄下存放這些文件;
    • STATICFILES_DIRS: 
      可能我們工程下會有多個app,或者還會牽涉到其它的靜態資源文件目錄,STATICFILES_DIRS就是列出一些文件目錄,如,在app core下static目錄,此目錄下存放的就是只與該app相關的資源文件;

html文件引入配置

<!DOCTYPE html>
<html lang="en">
<link rel="stylesheet" href="/static/myapp.css" type="text/css">
<head>
    <meta charset="UTF-8">
    <title>歡迎頁面</title>
</head>
<body>
<h1 class="h1" id="h1">歡迎來到我的頁面
{{time}}</h1>

</body>

css頁面

h1{
    background-color: green;
}

最終頁面效果

 

加載JS也是一樣

html在 head后添加

<script type="text/javascript" src="/static/myapp.js"></script>

創建myapp.js

/**
 * Created by USER on 2018/9/12.
 */
$(document).ready(function () {
    $("h1").click(function () {
        $(this).css("background-color","red");
    })
})

最終顯示效果

哈哈不足之處請批評指正哈

 

 

下面開始進行urls 路由配置

路由配置

URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要為該URL調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對於客戶端發來的某個URL調用哪一段邏輯代碼對應執行。

 

先貼出咱們url.py 的配置

from django.contrib import admin
from django.urls import path
from  myapp import views
from  django.conf.urls.static import static
from  django.conf import settings
from  django.conf.urls import url #導入模塊
urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/',views.hello),
    url(r'^hello/([0-9]{4})/$', views.year_archive),
    url(r'^hello/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^hello/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]+ static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)

注意:

  • 若要從URL 中捕獲一個值,只需要在它周圍放置一對圓括號。
  • 不需要添加一個前導的反斜杠,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles
  • 每個正則表達式前面的'r' 是可選的但是建議加上。它告訴Python 這個字符串是“原始的” —— 字符串中任何字符都不應該轉義

下面咱們可以請求一些試列

在請求試列之前,先要創建好相對應的返回頁面 

編輯views.py

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
# request 是固定寫法
def hello(request):
    import datetime
    now = datetime.datetime.now()
    time =now.strftime("%Y-%m-%d %X")
    return render(request,'hello.html',{"time":time})

def year_archive(request,year):
    return HttpResponse(year+"year_archive")
def month_archive(request,year,month):
    return HttpResponse(year+month+"month_archive")
def article_detail(request,year,month,num):
    return HttpResponse(year+month+num+'article_detail')

  訪問 http://127.0.0.1:8000/hello/

訪問 http://127.0.0.1:8000/hello/2018/

訪問 http://127.0.0.1:8000/hello/2018/09/

 

訪問 訪問 http://127.0.0.1:8000/hello/2018/09/12/

 

根據不同的URL 來轉發不同的網頁

匹配規則是從上向下匹配,匹配到上面就回直接返回頁面,所以要注意書寫順序。

 

有名分組

上面的示例使用簡單的、沒有命名的正則表達式組(通過圓括號)來捕獲URL 中的值並以位置 參數傳遞給視圖。在更高級的用法中,可以使用命名的正則表達式組來捕獲URL 中的值並以關鍵字 參數傳遞給視圖。

在Python 正則表達式中,命名正則表達式組的語法是(?P<name>pattern),其中name 是組的名稱,pattern 是要匹配的模式。

下面是以上URLconf 使用命名組的重寫:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

 

這個實現與前面的示例完全相同,只有一個細微的差別:捕獲的值作為關鍵字參數而不是位置參數傳遞給視圖函數。例如:

'''
    /articles/2005/03/ 請求將調用views.month_archive(request, year='2005', month='03')函數,而不是views.month_archive(request, '2005', '03')。
    /articles/2003/03/03/ 請求將調用函數views.article_detail(request, year='2003', month='03', day='03')。

    '''

在實際應用中,這意味你的URLconf 會更加明晰且不容易產生參數順序問題的錯誤 —— 你可以在你的視圖函數定義中重新安排參數的順序。當然,這些好處是以簡潔為代價;

 

簡單的登錄驗證

首先寫一下login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄頁面</title>
</head>
<body>
<form action="{% url 'Log' %}"method="post">
    用戶名<input type="text" name="user">
    密碼  <input type="password" name="password">
    <input type="submit">
</form>
</body>
</html>

在寫一下邏輯views.py

def login(request):
    if request.method=="GET": #如果瀏覽器發起的是GET請求則返回登錄頁面
        return render(request,'login.html')
    else:#當用戶點擊submit 按鈕,發送的自然是POST的請求
        print(request.POST)
        user=request.POST.get('user')#在這里將獲取的POST值存儲到變量,進行判斷
        pwd=request.POST.get('password')
        if user=='liu' and pwd =='123':#返回給用戶相對應的結果
            return HttpResponse('登錄成功')
        else:
            return HttpResponse('登錄失敗')

 

最終效果

 

 下面咱們來說一下反向解析。

反向解析

隨着功能的增加會出現更多的視圖,可能之前配置的正則表達式不夠准確,於是就要修改正則表達式,但是正則表達式一旦修改了,之前所有對應的超鏈接都要修改,真是一件麻煩的事情,而且可能還會漏掉一些超鏈接忘記修改,有辦法讓鏈接根據正則表達式動態生成嗎? 就是用反向解析的辦法。

 

 

使用方法

  • 定義url時,需要為include定義namespace屬性,為url定義name屬性
  • 使用時,在模板中使用url標簽,在視圖中使用reverse函數,根據正則表達式動態生成地址,減輕后期維護成本。
html中的反向解析
    1.1 原理:給url起名字,根據url的名字找到對應的視圖
        {% url 'register' %}
        # 如果url匹配時攜帶參數:
        url(r'^index/(\d+)/$', views.index, name='index'),
        # 那么,在匹配到視圖時就需要傳入一個參數:
        def index(request,param):
            return render(request, 'index.html', {'param':param})
        # 在頁面中的url反向解析,也要傳入對應參數
        <a href="{% url 'index' 10 %}">跳轉</a>
            
    1.2 {% url 'users:register' %}與{% url 'register' %}的區別?
        # 當項目中有多個應用的時候,給url起的名字就會相同,
        # 所以為了區分,才有的{% url 'users:register' %};
        # 在使用{% url 'register' %}時不要在項目urlconf中添加namespace;

 

 

.視圖中的反向解析
    1.1 導入模塊
        from django.core.urlresolvers import reverse
        def index(request):
            redirect_url = reverse('index', args=(1,))
            return HttpReponse('ok')
            
3.視圖中的重定向跳轉:
    from django.shortcuts import redirect
    from django.core.urlresolvers import reverse
    ...
    return redirect(reverse('users:register'))

 

接黃大佬的圖一用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM