一、静态文件的配置
静态文件指的是在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为自定义转换器类,可以在其中实现自定义转换方法。
浙公网安备 33010602011771号