本文主要是介绍Specifying a namespace in include() without providing an app_name is not supported,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在学习django 2.0开发web应用程序过程中,通过项目基础URL(http://localhost:8000/)返回默认的Django网站。如若我们需要房访问自己建立的网站,就需要通过URL映射自己程序的网页。
通过添加自身程序代码来进行URL映射过程中,发现程序报错:
File "F:\编程资料\python\python project\learndjango\learndjango\urls.py", line 21, in <module>path('', include('learndjangos.urls', namespace='learndjangos'))File "E:\program files\Python\Python36\lib\site-packages\django\urls\conf.py", line 39, in include'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.
查看django.urls中include函数源码:
"""Functions for use in URLsconfs."""
from functools import partial
from importlib import import_modulefrom django.core.exceptions import ImproperlyConfiguredfrom .resolvers import (LocalePrefixPattern, RegexPattern, RoutePattern, URLPattern, URLResolver,
)def include(arg, namespace=None):app_name = Noneif isinstance(arg, tuple):# Callable returning a namespace hint.try:urlconf_module, app_name = argexcept ValueError:if namespace:raise ImproperlyConfigured('Cannot override the namespace for a dynamic module that ''provides a namespace.')raise ImproperlyConfigured('Passing a %d-tuple to include() is not supported. Pass a ''2-tuple containing the list of patterns and app_name, and ''provide the namespace argument to include() instead.' % len(arg))else:# No namespace hint - use manually provided namespace.urlconf_module = argif isinstance(urlconf_module, str):urlconf_module = import_module(urlconf_module)patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)app_name = getattr(urlconf_module, 'app_name', app_name)if namespace and not app_name:raise 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.',)namespace = namespace or app_name# Make sure the patterns can be iterated through (without this, some# testcases will break).if isinstance(patterns, (list, tuple)):for url_pattern in patterns:pattern = getattr(url_pattern, 'pattern', None)if isinstance(pattern, LocalePrefixPattern):raise ImproperlyConfigured('Using i18n_patterns in an included URLconf is not allowed.')return (urlconf_module, app_name, namespace)def _path(route, view, kwargs=None, name=None, Pattern=None):if isinstance(view, (list, tuple)):# For include(...) processing.pattern = Pattern(route, is_endpoint=False)urlconf_module, app_name, namespace = viewreturn URLResolver(pattern,urlconf_module,kwargs,app_name=app_name,namespace=namespace,)elif callable(view):pattern = Pattern(route, name=name, is_endpoint=True)return URLPattern(pattern, view, kwargs, name)else:raise TypeError('view must be a callable or a list/tuple in the case of include().')path = partial(_path, Pattern=RoutePattern)
re_path = partial(_path, Pattern=RegexPattern)
发现在Django 2.0中,django.urls中include函数第一个参数传入的是tuple类型,其中一个是参数是app_name,且app_name需赋值。我们修改程序:
from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path(r'', include(('learndjangos.urls', 'learndjangos'), namespace='learndjangos'))
]
在views.py中代码如下:
from django.shortcuts import render# Create your views here.def index(request):return render(request, 'learndjangos/index.html')
经过测试,访问http://localhost:8000,页面顺利打开。
这篇关于Specifying a namespace in include() without providing an app_name is not supported的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!