目录
路由分发
django支持每个应用都可以有自己独立的路由层、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起
多个应用都有很多路由与视图函数的对应关系 这个时候可以拆分到各自的路由层中
使用路由分发之前 总路由直接干路由与视图函数的匹配
path('index/', index)
使用路由分发之后 总路由只按照应用名分配匹配方向
path('app01/', include('app01.urls'))
代码:
创建2个app,分别是app01和app02,并注册到settings.py里面.
app01:
urls.py:
from django.urls import path
from app01 import views
urlpatterns = [
path('index/',views.index)
]
views.py:
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
return HttpResponse('from app01 index view')
app02:
urls.py:
from django.urls import path
from app02 import views
urlpatterns = [
path('index/',views.index)
]
views.py:
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
return HttpResponse('from app02 index view')
django项目:
urls.py:
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
#路由分发
path('app01/',include('app01.urls')),
path('app02/',include('app02.urls')),
]
验证:
名称空间
路由分发之后 针对相同的别名能否自动反向解析出不同的应用前缀
默认情况下是无法直接识别应用前缀的
如果想要正常识别区分有两种方式
方式1:名称空间
总路由
path('app01/', include(('app01.urls', 'app01'), namespace='app01')),
path('app02/', include(('app02.urls', 'app02'), namespace='app02')),
反向解析(后端views.py)
reverse('app01:index_view')
reverse('app02:index_view')
方式2:别名不冲突即可
多个应用别名不冲突可以用应用名作为别名的前缀
path('index/', views.index, name='app01_index_view')
path('index/', views.index, name='app02_index_view')
虚拟环境
项目1需要使用:django1.11 python38
项目2需要使用:django2.22 pymysql requests python38
项目3需要使用:django3.22 request_html flask urllib3 python38
实际开发项目中我们只会给项目配备所需的环境,不需要的一概不配!!!
虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境
pycharm创建虚拟环境:(每创建一个虚拟环境就相当于重新下载了一个全新的解释器)
命令行的方式: python -m venv pyvenv38
注意:python命令此处不支持多版本共存的操作 python27 python36 python38
激活
activate
关闭
deactivate
pip install --index-url http://mirrors.aliyun.com/pypi/simple/ django==1.11.11 --trusted-host mirrors.aliyun.com
视图层之必会三板斧
用来处理请求的视图函数都必须返回HttpResponse对象 完全正确
class HttpResponse:
pass
return HttpResponse()
def render():
return HttpResponse()
return render()
def redirect():
redirect_class = 类(祖先有个类是HttpResponse)
return redirect_class()
return redirect()
JsonResponse对象
from django.http import JsonResponse
# Create your views here.
def index_func(request):
# 返回给浏览器一个json格式的字符串
user_dict = {'name':'jason老师','age':18}
return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
ps:以后写代码很多时候可能需要参考源码及所学知识扩展功能
class JsonResponse(HttpResponse):
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs):
data = json.dumps(data, cls=encoder, **json_dumps_params)
JsonResponse主要序列化字典 针对非字典的其它可以被序列化的数据需要修改safe参数为False
代码:
项目urls.py
from app01 import views
path('index/',views.index_func),
app01.views.py
from django.http import JsonResponse
# Create your views here.
def index_func(request):
# 返回给浏览器一个json格式的字符串
user_dict = {'name':'jason老师','age':18}
# import json #手动json序列化
# user_json = json.dumps(user_dict,ensure_ascii=False)
# return HttpResponse(user_json)
return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
视图层之request对象获取文件
视图层之FBV与CBV
CBV源码剖析(重点)
模板层
标签:index,FBV,views,视图,虚拟环境,app01,urls,path,路由
From: https://www.cnblogs.com/winter-yu1989/p/16979440.html