1

配置,静态文件和路由说明

配置文件

BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

这个获取到的路径是跟manage.py同级

 

本地语言和时区

LANGUAGE_CODE = 'en-us'  # 语言
TIME_ZONE = 'UTC'  # 时区

将语言和时区修改为中国大陆信息

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

静态文件

为了提供静态文件,需要配置两个参数:

  • STATICFILES_DIRS 存放查找静态文件的目录
  • STATIC_URL 访问静态文件的URL前缀

例如

manage同级下面创建一个文件夹static_files

在配置文件settings.py中修改配置信息如下

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static_files'),
]
 
例如我们在static_files 新建一个index.html文件
image

我们就可以在浏览器中127.0.0.1:8000/static/index.html来访问。

image

或者我们在static_files目录中添加了一个子目录和文件goods/detail.html,在浏览器中就可以使用127.0.0.1:8000/static/goods/detail.html来访问。

 

路由

1.路由顺序解析

django在接收到一个请求的时候,从主路由文件中的urlpatterns列表中以由上至下的顺序查找对应路由规则,如果发现规则为include包含,则再进入被包含的urls中的urlpatterns列表由上至下进行查询。

值得关注的由上至下的顺序,有可能会使上面的路由屏蔽掉下面的路由,带来非预期结果。例如:

urlpatterns = [
    url(r'^say', views.say),
    url(r'^sayhello', views.sayhello),
]

即使访问sayhello/路径,预期应该进入sayhello视图执行,但实际优先查找到了say路由规则也与sayhello/路径匹配,实际进入了say视图执行。

 

解决办法

在路由后面加个/$,如下

urlpatterns = [
    url(r'^say/$', views.say),
    url(r'^sayhello/$', views.sayhello),
]

 

2.路由命名和reverse反解析(逆向)

2.1 路由命名(命名空间, namespace, name)

在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。

1) 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如

drf_django/urls路由下

url(r'^users/$', include('users.urls', namespace='users')),

意思就是凡是users.urls中定义的路由,反向解析全部指定到users下

作用是避免使用了相同的url名字,发生冲突,使用命名空间区别开

 

2) 定义普通路由时,可以使用name参数指明路由的名字,如

urlpatterns = [
    url(r'^index/$', views.index, name='index'),
    url(r'^say/$', views.say, name='say'),
]

name没有作用域,在反解URL时,进行全局顺序搜索查找到第一个name指定URL时立即返回,我们在开发项目时,会经常使用name属性反解出URL,当不小心定义相同的name时,可能会导致URL反解错误,这时就引入了命名空间

 

总结:当在普通路由下指定了name,我们在反解析路由地址的时候,比如有多个app,每个app下name都指定了index,这时就引入了命名空间 也就是namespace,来进行区分,为下面反解析铺垫。

 

2.2 reverse(反解析)

使用reverse函数,可以根据路由来返回具体的路径。

from django.urls import reverse


def index(request):
    """
    index视图
    :param request:包含了请求信息的请求对象
    :return:响应对象
    """
    return HttpResponse('hello the word!!')


def say(request):
    url = reverse('users:index') # /users/index/
    print(url)
    return HttpResponse('say')

总结:

  • 对于未指明namespace的,reverse(路由name)
  • 对于指明namespace的,reverse(命名空间namespace:路由name)

 

3 路径结尾/的说明

urlpatterns = [
    url(r'^index/$', views.index, name='index'),
]

定义URL的时候我们通常以/$结尾,用户访问的时候不加/,Django会把用户重定向到以斜线/结尾的路径上,而不会返回404不存在

总结:

用户访问 index 或者 index/ 网址,均能访问到index视图。

posted @ 2019-05-21 16:23  小白森  阅读(313)  评论(0编辑  收藏  举报