1 url基本概念及格式
1.1 url概念
URL(Uniform ResoureLocator)统一资源定位符,是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
1.2 url格式
1.3 url.py的作用
URL配置(URLconf)就像是Django所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表。以这样的方式告诉Django,对于那个URL调用那段代码。url的加载就是从配置文件中开始
2 Django路由系统
当一个请求来到时:
- 首先到项目目录下的urls.py (根URLconf模块)中,查找路由规则
- 根URLconf模块,里面定义了 urlpatterns 变量
- urlpatterns 是一个(django.urls.path,django.urls.re_path 对象)列表
- 按顺序运行每个url模式,在第一个匹配的模式停止
- 一旦匹配,django导入并调用给定的视图
- 如果中间出错,或者没有匹配到,返回404
2.1 path
- path(route, view, kwargs=None, name=None)
- route 是一个字符串的url规则
- view 是一个视图
- kwargs 额外参数,传递给view,必须是一个字典
- name url的命名
# 基本规则
- 使用尖括号(<>)从url中捕获值。包含一个转化器类型(converter type)没有转化器,将匹配任何字符串,当然也包括了 / 字符。
- 当前面的url匹配成功后,就会调用后面的视图函数
-
在url中捕获参数
在url规则中使用 <变量名> 可以捕获url中的值
传递给视图
捕获的值是 字符串 -
路径转换器
类型
- str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式 - int,匹配正整数,包含0。 - slug,匹配字母、数字以及横杠、下划线组成的字符串。 - uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 - path,匹配任何非空字符串,包含了路径分隔符
使用
- 1.设置url: path('test/<int:xx>/',views.test3) - 2.在视图中将获取到的参数和参数的类型打印出来: def test3(request,xx): print(xx,type(xx)) return HttpResponse('hello %s'%xx)
2.2 re_path
- 使用正则表达式 re_path(route, view, kwargs=None, name=None)
python 中 正则表达式的分组命名 (?pattern) - django 搜索 url 搜索的是什么?
只搜索路径部分,跟参数,以及请求方法(get,post)无关
同一个url 可以匹配 get, post
2.3 include
-
作用
一个url对应一个视图函数,但我们的视图越来越多时,url也就越来越多
一个project有一个总的urls.py,各个app也可以自己建立自己的urls.py
用include()函数在project的urls.py文件进行注册 -
例子
# 项目主目录下的主urls.py from django.contrib import admin from django.urls import path,include from . import views urlpatterns = [ path('admin/', admin.site.urls), path('book/',include('book.urls')), ] # APP books里面的urls.py from django.urls import path from . import views urlpatterns = [ path('index/',views.index), ] # APP books里面的views.py from django.shortcuts import render from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse('这个book的首页!!')
2.4 kwargs
-
作用
传递一个Python 字典作为额外的参数传递给视图函数。
视图函数中可以通过关键字参数获取到
☆☆☆☆ 当kwargs 中的key 与 url捕获中的key 一致的时候,以kwargs为准 -
例子
# 主urls.py文件 from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('book/',include('book.urls'),{'switch':'true'}), ] # APP books里面的views.py from django.http import HttpResponse import datetime def index(request,**kwargs): if kwargs.get('switch') == 'true': print(datetime.datetime.now()) return HttpResponse('这个book的首页!!')
☆☆☆☆ 需要统一给下面的url一些参数的时候使用include传递Kwargs显得尤其有用
2.5 name
-
作用
给一个匹配的url地址取名字,一般用于模板,也可以使用reverse进行页面重定向
-
例子
# APP books里面的urls.py from django.urls import path from . import views urlpatterns = [ path('index/', views.index), path('article/', views.article, name='old'), path('article_new/', views.article_new, name='new_article') ] # APP books里面的views.py from django.shortcuts import render, reverse, redirect from django.htto import HttpResponse import datetime def index(request, **kwargs): if kwargs.get('switch') == 'true': print(datetime.datetime.now()) return HttpResponse("这个book的首页!!!") def article(request, **kwargs): if kwargs.get('switch') == 'true': return redirect(reverse('new_article')) return HttpResponse('这是文章的首页') def article_new(response, **kwargs): return HttpResponse('这是新的文章的首页!!!')
☆☆☆☆ redirect是重定向,reverse是将url的name解析成url本身的函数
name参数可以给这个url取一个合适的名字。通过给url取名字,以后在view或者模板中使用这个URL,就只需要通过这个名字就可以了。这样做的原因是防止url的规则更改,会导致其他地方用了这个url的地方都需要更改,但是如果取名字了,就不要做任何改动了。 -
app_name
当多个APP里重定向时的url的name相同时,为避免混乱可以使用app_name
定义在 app文件夹下的urlconf模块中
app_name = app名称
3 模板配置与渲染
Django怎样去调用漂亮的HTML前端页面呢?
3.1 模板路径配置
-
在主目录下创建一个templates目录用来存放所有的html的模板文件.
-
templates目录里面再新建各个以app名字命名的目录来存放各个app中模板文件.
-
setting.py中的模板路径配置
将我们的设置好的存放html模板的templates目录路径添加到DIRS中
3.2 模板渲染
# 1.直接将html字符串硬编码HttpResponse中
def index_1(request):
return HttpResponse('<h1>Hello Django World!</h1>')
# 2.django.template.loader 定义了函数以加载模板
from django.template.loader import get_template
def index_2(request, xx):
tp = get_template('music/index.html')
html = tp.render()
return HttpResponse(html)
# 3.使用render进行渲染。
def index_3(request, xx):
return render(request, 'music/index.html')