1. 程式人生 > >【Django2x 學習筆記 03】建立path路由url(建立新路由URL,pathinfo模式多個傳參,GET模式多個傳參,返回json)

【Django2x 學習筆記 03】建立path路由url(建立新路由URL,pathinfo模式多個傳參,GET模式多個傳參,返回json)

注意:Django2.1.3 下環境,Python3.7,基於最新的語言和框架的特性。

#1 已新建一個Django專案工程——mysite(假設:F = /django/mysite/ 目錄)

django-admin startproject mysite

#2 建立一個簡單的path路由:

1. 建立一個功能模組blog:

D:\python\do\django\mysite>python manage.py startapp blog

D:\python\do\django\mysite>

此時F下多出一個blog/ 目錄。

-

2. F/mysite/下的settings.py註冊blog:

INSTALLED_APPS = [
    。。。。。
    。。。。。
    'blog',
]

3. F/mysite/下的urls.py 新增blog路由:

from blog import views  # 匯入試圖模組
# python manage.py runserver 8080

urlpatterns = [
    path('admin/', admin.site.urls),

    path('test/', views.test),  # 新路由
]

4. F/blog/下的views.py設定輸出函式:

from django.http import HttpResponse


def test(request):
    print(request)
    return HttpResponse('route is success')

5. 啟動專案:

python manage.py runserver 8080

-#3 新增一個帶引數url:

1. 相容模式GET請求URL帶引數:

F/mysite/urls.py,直接建立一個路由名稱即可,不用pathinfo模式正則/xx/yy:

path('data1/', views.data1),  # 攜帶一個或者多個引數

F/blog/views.py,這個你要理解request引數的妙用:

def data1(request):  # GET傳參
    if 'p1' in request.GET or 'p2' in request.GET:
        message = '內容為: p1=' + str(request.GET.get('p1')) + '== p2=' + str(request.GET.get('p2'))
    else:
        message = '空get'
    return HttpResponse(message)

瀏覽器檢視:

http://localhost:8080/data1/?p1=1&p2=ha

2. pathinfo URL帶引數(實際上是另一種方式的GET傳參),一些nginx伺服器可能需要這種模式:

F/mysite/urls.py,引數寫為<xx>

path('data2/p1/<p1>/p2/<p2>/', views.data2),  # pathinfo攜帶引數

F/mysite/views.py,:

def data2(request, p1, p2):  # pathinfo傳參
    msg = 'p1=' + str(p1) + '== p2=' + str(p2)

    return HttpResponse(msg)

瀏覽器檢視:

-

注意:本片篇部落格未涉及 Django模板渲染、path分組等問題,完全是面向介面的思考模式。

-

#4 返回json,並處理中文亂碼:

需要 import json ,

返回請求:

return HttpResponse(json.dumps(message, ensure_ascii=False), content_type='application/json; charset=utf-8')

注意, content_type裡面是英文分號,不是英文逗號。

def json1(request, p1, p2):
    message = {
        'p1': p1,
        'p2': p2,
    }
    return HttpResponse(json.dumps(message, ensure_ascii=False), content_type='application/json; charset=utf-8')

-------

所有程式碼:

1)F/blog/urls.py

from blog import views
# python manage.py runserver 8080

urlpatterns = [
    path('admin/', admin.site.urls),

    path('', views.index),  # 空目錄
    path('test/', views.test),  # 不攜帶引數
    path('data1/', views.data1),  # GET攜帶引數
    path('data2/p1/<p1>/p2/<p2>/', views.data2),  # pathinfo攜帶引數
    path('json1/p1/<p1>/p2/<p2>/', views.json1),  # pathinfo攜帶引數,返回json

]

2)F /blog/views.py:

from django.http import HttpResponse
import json


def index(requst):
    message = '空目錄。Django服務已經啟動。'

    return HttpResponse(message)


def test(request):
    print(request)

    return HttpResponse('route is success')


def data1(request):  # GET傳參
    if 'p1' in request.GET or 'p2' in request.GET:
        message = '內容為: p1=' + str(request.GET.get('p1')) + '== p2=' + str(request.GET.get('p2'))
    else:
        message = '空get'
    return HttpResponse(message)


def data2(request, p1, p2):  # pathinfo傳參
    message = 'p1=' + str(p1) + '== p2=' + str(p2)

    return HttpResponse(message)


def json1(request, p1, p2):
    message = {
        'p1': p1,
        'p2': p2,
    }
    return HttpResponse(json.dumps(message, ensure_ascii=False), content_type='application/json; charset=utf-8')

3)F/mysite/setting.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'blog',
]

-