【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',
]
-