文章目录
url基本概念及格式
- 访问网站
- 作为访问者,知道了url就可以去进行访问
- 作为服务者,设置好url别人下可以访问到
- url概念
- URL(Uniform Resource Locator)全球统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址
- 互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它
url格式
http:指定使用的协议(如:http,https,ftp)
path(路径):访问资源的路径
参数:发送给http服务器的数据
#name是锚点
urls.py的作用
- url配置(URLconf)就像是Django所支撑网站的目录,它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表,以这样的方式告诉Django,对于那个URL调用那段代码,url的加载就是从配置文件中开始
url例子
- 在项目目录下urls.py文件
- 在项目目录创建了一个views.py文件
url分析
django的路由系统
- django搜索url只搜索路径部分,跟参数以及请求方法(get,post)无关
- 同一个url可以匹配get,post
- 当一个请求来到时
- 首先到项目目录下的urls.py(根配置模块URLconf),查找路由规则
- 根URLconf模块,里面定义了urlpatterns变量
- urlpatterns是一个(django.urls.path,django.urls.re_path对象)列表
- 按顺序运行每个url模式,在第一个匹配的模式停止
- 一旦匹配,django导入并调用给定的视图
- 如果中间出错,或者没有匹配到,返回404
path和re_path
path基本规则
- path(route,view,kwargs=None,name=None)
- route是一个字符串的url规则,必须有
- view是个视图,必须有
- kwargs是额外参数,传递给view,必须是字典
- name是 url的命名
在url中捕获参数
- 用尖括号<变量名>可以捕获url中的值传递给视图
- 捕获的值是字符串
也可以这样
-
urls.py文件demo
urlpatterns = [ path('admin/', admin.site.urls), # path('index/', views.index), #index前不要加/,django自动添加,index后面要加/ path('app_index/', student_views.app_index), path('detail/<slug>-<pk>/', views.detail), #捕获的值传递给views.py里的detail(request,pk)的pk,也可以写成<slug>/<pk>/ ]
-
路径转换器
-
限制路径中的格式,并自动类型转换,例如:
path('detail/<int:pk>/', views.detail)
常用的路径转换器
- str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
- int,匹配整数,包含0
- slug,匹配字母,数字以及横杠,下划线组成的字符串(ascii字符)
- uuid,格式化id
- path,匹配任何非空字符,包含了路径分隔符
re_path正则匹配
-
re_path(route,view,kwargs=None,name=None)
-
python中正则表达式的分组命名 (?pattern)如:
re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9]|1[0-2])/', views.students)
-
如果如下面这样,也可以,是按位置参数定位,不是按关键字参数,容易出错
re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9]|1[0-2])/', views.students)
包含其他的URLconfs
- 一般情况下不会在项目目录下写views.py文件,这个是公共的,要写就写每个app的views
include的作用
- 一个project有一个总的urls.py,各个app也可以自己建立自己的urls.py,用include()函数在project的urls.py文件进行注册
- include的工作方式是截取students/后面的路径,然后去students中的urls.py文件中匹配对应的
传递额外参数
-
path,re_path方法中,传递一个kwargs字典参数作为额外的参数传递给视图函数,视图函数中可以通过关键字参数获取到
-
如果students的urls.py中path有额外参数,如:
path('detail/<int:pk>/', views.detail, kwargs={'status': True})
则students的views.py应该也加上status参数,否则会报错
def detail(request, pk, status): #pk一般是个id,是整数primary key return HttpResponse('学生id为%s的详情页' % pk)
-
如果项目的总urls.py文件中:
path('students/', include('students.urls'), kwargs={'somekey': 'somevalue'})
那么相当于students的urls.py文件中所有的路径都加上了,kwargs={‘somekey’: ‘somevalue’}参数,在students的urls.py文件中就可以不加了,students的views.py文件中仍然如此:
def detail(request, pk,somekey): #pk一般是个id,是整数primary key return HttpResponse('学生id为%s的详情页' % pk)
当kwargs中的key与url捕获中的key一致的时候,以kwargs为准
-
students的views.py文件中:
def detail(request, pk): #pk一般是个id,是整数primary key return HttpResponse('学生id为%s的详情页' % pk)
-
students的urls.py文件中:
path('detail/<int:pk>/', views.detail, kwargs={'pk': 10})
此时pk的值为定值10
url命名
-
页面重定向,跳转页面,比如登陆之后
views.py:from django.shortcuts import render, redirect def index(request): return HttpResponse('hi girl') def login(request): return redirect('/students/index') #硬编码
就可以自动跳转到127.0.0.1:8080/students/index页面,硬编码不方便更改,管理
name的作用
-
给一个匹配的url地址取名字
-
name参数可以给这个url取一个合适的名字,通过给url取名字,以后在view或者模板中使用这个URL,就只需要通过这个名字就可以了
-
这样做的原因是防止url的规则更改,会导致其他地方用了这个url的地方都需要更改,但是如果取名字了,就不要做任何改动了
-
一般用于模板,也可以使用reverse进行页面重定向
-
redirect是重定向,reverse是将url的name解析成url本身的函数
-
页面重定向的例子
views中:def login(request): url = reverse('index') return redirect(url)
登录127.0.0.1:8000/students/login/后,自动跳转到127.0.0.1:8000/students/home/
当home改为aaa时,效果不变
但如果多个app有index时会出错,要用app_name
app_name
-
定义在app文件夹下的urlconf模块中
app_name = app名称 -
teachers中的urls.py文件:
from django.urls import path, re_path from teachers import views app_name = 'teachers' urlpatterns = [ path('index/', views.index, name='index'), path('login/', views.login) ]
-
teachers中的views.py文件:
from django.shortcuts import render, reverse, redirect from django.http import HttpResponse def index(request): return HttpResponse('我是teachers页面,hi girl') def login(request): url = reverse('teachers:index') return redirect(url)
这样会跳转到app自己对应的路由,不会出错
模板路径配置
- 在主目录下(和manage.py同等级,也叫项目根目录)创建一个templates目录用来存放所有的HTML的模板文件
- templates目录里面在新建各个以app名字命名的目录来存放各个app中模板文件
模板渲染方式
- 直接将HTML字符串硬编码HttpResponse中
- django.template.loader定义了函数已加载
- 使用render进行渲染
-
渲染
tp = get_template('students/index.html') html = tp.render() return HttpResponse(html)
-
简便方式(推荐)
return render(request, 'students/index.html') #等同于上三步
-