一、静态文件的配置

  静态文件指的是在django项目下,创建statics目录,里边存放js和css,jquery等文件,其中templates目录是使用pycharm创建项目是自动生成的(或者手动创建)存放html文件的。它和static共同实现WEB前端功能。

  

  类似于templates目录,statics也要设置路径地址,在settings下设置:

  

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'statics')
]

  其中 STATIC_URL设置的名称为浏览器访问时输入的目录地址,实际寻找文件时会从 STATICFILES_DIRS下查找。 

二、路由控制的简单配置

  浏览器将请求信息发给服务器后,服务器会通过urls.py文件匹配path来解析要返还给浏览器对应的响应。path设置为精准匹配,而通过re_path可以使用正则表达式

  来设置模糊匹配来返回对应的请求信息。

  

from django.contrib import admin
from django.urls import path,re_path
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^redir/([0-9]{4}/([0-9]{2})/([0-9]+)/$',views.redir)
]

  同时设置views下的redir函数功能:

 

def redir(request,arg1,arg2,arg3):
    return HttpResponse(arg1+arg2+arg3)

  也可以是使用 return render(request,‘index.html’)来返还一个html页面,django自动从template里边寻找对应的html。

  它的参数量除去request之外要对应re_path的路径数量

三、路由控制之有名分组

  有名分组是指在二的基础上,将参数设置为关键字参数,这样访问时候不必按照位置输入参数。

  在urls下:

  

   re_path(r'^redir/(?P<arg1>[0-9]{4})/(?P<arg2>[0-9]{2})/(?P<arg3>[0-9]+)/$',views.redir)

  在view下之后的redir参数中的arg1,arg2,arg3的位置就不必固定,但是最终返还的结果还是按照re_path下的顺序。

  要注意的是view下的参数名要和re_path中?P<>中的字符一样。

  最后在浏览器中输入符合正则表达式的目录路径就会指向对应的views下的函数来执行返回信息。

  

 

四、路由控制之分发

  当一个django项目下有许多应用时,urls存放所有的应用请求信息解析时,会产生混乱以及不便管理等,因此在父目录下的urls文件之下只存放

  公共全局的响应解析的path,然后在各自的应用工程下新建urls.py文件来设置各自的re_path等,相当于解耦合。那么django如何在相同的urls找到

  请求信息的path呢?

  只要在父目录下urls下设置:

  

    re_path(r'blog/',include('blog.urls')),

  那么当浏览器请求blog这个应用时,父目录的urls文件则自动将请求交给blog应用下urls去解析。这样便完成了分发这个操作。

五、路由控制之反向解析

  (1)当我们在页面点击一些提交按钮时,页面会转向固定的地址,那么当在html页面action中把地址写成固定后,以后修改起来就会很麻烦。

  而使用反向解析时,则自动解析地址。

  首先在urls中配置:

    path('login/',views.login,name='Log'),

  在html页面中写成:

<form action="{% url 'Log' %}" method="post">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="pwd">
    <input type="submit">
</form>
{% url 'Log' %}的意思是在浏览器解析地址时候解析的时候将url下的name=Log的路径login变为url,在浏览器下可以看到html页面自动解析为login。
<form action="/login/" method="post">

  这样以后修改浏览器url地址时只要修改urls.py下的路径,而html页面的配置无需修改,自动解析,可以省去很多麻烦。

 (2)通过reverse模块也能实现

  views下:

from django.urls import reverse
def index(request):
    return HttpResponse(reverse('index'))

  其中index为re_path或path下name。reverse通过path下的name找到其对应的路径返还。

六、路由控制之名称空间

  当多个应用中urls下re_path的name相同时,并且对应views下方法通过Httpresponse返回的内容也一样时,那么会出现浏览器访问不同的应用却得到相同的页面,使用namespace可以解决。

  在主目录下urls下: 

    re_path(r'blog02/',include(('blog02.urls','blog02'))), 

  同时应用下的views下:

def index(request):
    return HttpResponse(reverse('blog02:index'))

  产生这种现象的本质原因在于rerverse时的name相同,去全局urls下寻找对应路径时都是会为同一个,有一种覆盖效果。

  

七、url控制器中的path方法及自定义转换器

  re_path中传递的路径参数其实都是字符串格式的,因此如果想要设置int或者其他类型的(str,slug,uuid,path),就要使用path

  urls下:

path("redir/<int:arg1>/<int:arg2>/<int:arg3>/",views.redir_path)

  这种方法也是有名分组。

  自带的转换器不能满足各自的实际需求,但是可以通过自定义转换器定制各自的URL路径格式。

  通过在应用目录下创建一个转换器类方法的py文件: 

class Monconvert:
    regex = "[0-9]{2}"
    def to_python(self,value):
            return int(value)
    def to_url(self,value): #反向解析
            return '%04d' % value

  在父目录urls下注册转换器:

from django.urls import register_converter
register_converter(Monconvert,"mm")

  最后在应用的urls下:

path("redir/<mm:arg1>/",views.def_path)

  其中mm就是自定义的转换器名字,Monconvert为自定义转换器类,可以在其中实现自定义转换方法。