一个app可以创建多个实例。可以使用多个url映射到同一个app。这就会产生一个问题:以后在做反转的时候,如果使用应用命名空间,那么就会发生混淆。
项目下urls.py
文件:
urlpatterns = [
path('app01/', include('apps.app01.urls')),
path('app02/', include('apps.app02.urls')),
path('app03/', include('apps.app01.urls')),
重启服务访问 http://127.0.0.1:8000/app03
还真是脆弱。。。
为了避免这个问题。我们可以使用实例命名空间。实例命名空间只要在include
函数中传递一个namespace
变量即可。
项目下urls.py
文件:
urlpatterns = [
url(r'^admin/', admin.site.urls),
path('app01/', include('apps.app01.urls', namespace='app01')),
path('app02/', include('apps.app02.urls', namespace='app02')),
path('app03/', include('apps.app01.urls'), namespace='app03'),
以后在做反转的时候,就可以根据实例命名空间来指定具体的url。
app01下的views.py
,app02类似:
from django.http import HttpResponse
from django.shortcuts import redirect, reverse
def index(request):
username = request.GET.get('username')
if username:
return HttpResponse('app01首页')
else:
current_namespace = request.resolver_match.namespace
return redirect(reverse('%s:login' % current_namespace))
def login(request):
return HttpResponse('app01登录页面')
输入http://127.0.0.1:8000/app03/
输入 http://127.0.0.1:8000/app03?username='onefine'
注意:在使用实例命名空间之前,必须先指定一个应用命名空间——在子url.py中添加app_name变量。
'Specifying a namespace in include() without providing an app_name ’
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.