diff --git a/docs/img/RootUrlReadme/1.png b/docs/img/RootUrlReadme/1.png new file mode 100755 index 0000000000000000000000000000000000000000..08ab056c52cab0c98dde886662b445fab5f7e2ad Binary files /dev/null and b/docs/img/RootUrlReadme/1.png differ diff --git a/docs/img/RootUrlReadme/2.png b/docs/img/RootUrlReadme/2.png new file mode 100755 index 0000000000000000000000000000000000000000..be92118a75433709bf1f57f9fd16d0bf349af4b8 Binary files /dev/null and b/docs/img/RootUrlReadme/2.png differ diff --git a/docs/img/RootUrlReadme/3.png b/docs/img/RootUrlReadme/3.png new file mode 100755 index 0000000000000000000000000000000000000000..b2ff11185673ae65339324b4915e1ac0ff32edb9 Binary files /dev/null and b/docs/img/RootUrlReadme/3.png differ diff --git a/docs/img/RootUrlReadme/4.png b/docs/img/RootUrlReadme/4.png new file mode 100755 index 0000000000000000000000000000000000000000..a1c450457118f9cd23921bc10078ed002fea64e7 Binary files /dev/null and b/docs/img/RootUrlReadme/4.png differ diff --git a/docs/img/RootUrlReadme/5.png b/docs/img/RootUrlReadme/5.png new file mode 100755 index 0000000000000000000000000000000000000000..a0e4a105b75b0e10cf397e856790826ca2f9b220 Binary files /dev/null and b/docs/img/RootUrlReadme/5.png differ diff --git a/root_url_init/README.md b/root_url_init/README.md index 200189f2f63012b3cccac5b7f2cf078c961659c8..fabc7074f8332570ccb1423ba9a6d1a5088bdc94 100644 --- a/root_url_init/README.md +++ b/root_url_init/README.md @@ -28,3 +28,173 @@ python3 manage.py runserver - 设置ip为`192.168.3.50` - 设置port为8099 +## 三、路由介绍 + +一个完整的路由包含:路由地址、视图函数(或者视图类)、可选变量和路由命名。 +路由称为URL (Uniform Resource Locator,统一资源定位符),也可以称为URLconf,是对可以从互联网上得到的资源位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的路由,用于指出网站文件的路径位置。简单地说,路由可视为我们常说的网址,每个网址代表不同的网页。 +django中路由系统入口设置如下 + +```python +ROOT_URLCONF = 'config.urls' + +``` + +## 四、路由配置 + +### 4.1 普通配置 + +通过path定义请求访问的url触发对应的函数: + +```python +path('index/', app.views.index), +``` + +### 4.2 路由变量配置 + +在平时开发中,有时候一个路由可以代表多个不同的页面,比如博客系统里面,有1千个博客页面,按照前面学习的方式,需要写1千个路由才能实现,这种做法显然不可取,维护也麻烦。我们可以通过路由变量,来实现一个路由代表多个页面。 +路由的变量类型有字符类型、整型、slug 和 uuid,最为常用的是字符类型和整型。各个类型说明如下: +- 字符类型:匹配任何非空字符串,但不含斜杠。如果没有指定类型,就默认使用该类型。 +- 整型:匹配О和正整数。 +- slug:可理解为注释、后缀或附属等概念,常作为路由的解释性字符。可匹配任何ASCII字符以及连接符和下画线,能使路由更加清晰易懂。比如网页的标题是“15岁的孩子”,其路由地址可以设置为"15-sui-de-hai-zi"。 +- uuid:匹配一个uuid格式的对象。为了防止冲突,规定必须使用""并且所有字母必须小写,例如:175194d3-6885-437e-a8a8-6c231e272f00。 + +### 4.3 正则路由 + +- 正则urls匹配,必须用re_path方法 +- 正则表达式?P开头是固定格式 + +### 4.4 重定向响应 + +重定向称为HTTP协议重定向,也可以称为网页跳转,它对应的HTTP状态码为301、302、303、307、308。简单来说,网页重定向就是在浏览器访问某个网页的时候,这个网页不提供响应内容,而是自动跳转到其他网址,由其他网址来生成响应内容。 + +Django的网页重定向有两种方式: + +第一种方式是路由重定向; + +第二种方式是自定义视图的重定向。 + +两种重定向方式各有优点,前者是使用Django内置的视图类RedirectView实现的,默认支持HTTP的GET + +请求;后者是在自定义视图的响应状态设置重定向,能让开发者实现多方面的开发需求。 + +#### 4.4.1 路由重定向 + +路由重定向方式,我们用RedirectView实现,在urls.py里面,我们再加一个路由代码: + +```python +path('redirectTo', RedirectView.as_view(url="index/")) +``` + +#### 4.4.2 自定义视图重定向 + +视图代码里,通过逻辑判断,通过redirect方法来实现具体的页面重定向。 + +```python +def blog(request, id): + if id == 0: + return redirect("/static/error.html") + else: + return HttpResponse('id是' + str(id) + "的博客页面") +``` + +### 4.5 路由变量配置实例 + +#### 4.5.1 简单id用例实例 + +- urls.py定义路由映射 + + ![icon-note.gif](../docs/img/icon/icon-note.gif) **说明:** 冒号:两边不能有空格 + + ```python + path('blog/', app.views.blog) + ``` + +- views.py里定义blog函数实现 + + ```python + def blog(request, id): + return HttpResponse('id是' + str(id) + "的博客页面") + ``` + +- 打开浏览器访问:http://192.168.3.50:8099/blog/17 + + ![image-20250101163816518](../docs/img/RootUrlReadme/1.png) + +#### 4.5.2 年月日用例实例 + +- urls.py定义路由映射 + + ```python + path('diary////', app.views.diary) + ``` + +- views.py里定义blog函数实现 + + ```python + def diary(request, year, month, day, id): + return HttpResponse(str(year) + '/' + str(month) + '/' + str(day) + '/' + 'id是' + str(id) + "的日记页面") + ``` + +- 打开浏览器访问:http://192.168.3.50:8099/diary/2024/12/18/3 + + ![image-20250101163816518](../docs/img/RootUrlReadme/2.png) + +#### 4.5.3 正则路由实例 + +- urls.py定义路由映射 + + ```python + re_path('jenkins/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})', app.views.jenkins) + ``` + +- views.py里定义blog函数实现 + + ```python + def jenkins(request, year, month, day): + return HttpResponse('jenkins每日构建:' + str(year) + '/' + str(month) + '/' + str(day)) + ``` + +- 打开浏览器访问:http://192.168.3.50:8099/jenkins/2024/12/18 + + ![image-20250101175302160](../docs/img/RootUrlReadme/3.png) + +#### 4.5.4 路由重定向实例 + +- urls.py定义路由映射 + + ```python + path('redirectTo', RedirectView.as_view(url="index/")) + ``` + +- 打开浏览器访问:http://192.168.3.50:8099/redirectTo + + ![image-20250101175302160](../docs/img/RootUrlReadme/4.png) + +#### 4.5.5 自定义视图重定向实例 + +- urls.py定义路由映射 + + ```python + path('itopen/', app.views.itopen), + path('new_blog/', app.views.new_blog), + ``` + +- views.py里定义new_blog函数实现 + + ```python + def itopen(request, *args, **kwargs): + views_name = "Welcome to itopen group" + return render(request,"itopen.html") + + def new_blog(request, id): + if id == 0: + return redirect("/itopen/") + else: + return HttpResponse('id是' + str(id) + "的博客页面") + ``` + +- 打开浏览器访问:http://192.168.3.50:8099/new_blog/0和http://192.168.3.50:8099/new_blog/1 + + ![image-20250101175302160](../docs/img/RootUrlReadme/4.png) + +![image-20250101200441672](../docs/img/RootUrlReadme/5.png) diff --git a/root_url_init/app/views.py b/root_url_init/app/views.py index 5b70f9e662f72cd2dd21e94dadf9dda746ee0bea..1ad740d202194822ac8f0a9f5ccb67d721583490 100644 --- a/root_url_init/app/views.py +++ b/root_url_init/app/views.py @@ -1,7 +1,25 @@ -from django.shortcuts import render, HttpResponse +from django.shortcuts import render, redirect, HttpResponse # Create your views here. def index(request, *args, **kwargs): return HttpResponse("Hello, world!") +def blog(request, id): + return HttpResponse('id是' + str(id) + "的博客页面") + +def diary(request, year, month, day, id): + return HttpResponse(str(year) + '/' + str(month) + '/' + str(day) + '/' + 'id是' + str(id) + "的博客页面") + +def jenkins(request, year, month, day): + return HttpResponse('jenkins每日构建: ' + str(year) + '/' + str(month) + '/' + str(day)) + +def itopen(request, *args, **kwargs): + views_name = "Welcome to itopen group" + return render(request,"itopen.html") + +def new_blog(request, id): + if id == 0: + return redirect("/itopen/") + else: + return HttpResponse('id是' + str(id) + "的博客页面") \ No newline at end of file diff --git a/root_url_init/config/urls.py b/root_url_init/config/urls.py index 452f12713a434947f659d896ec5672579be0557e..3c3fc186d4a0d2fe83f3ce6a3af44f3940e6de17 100644 --- a/root_url_init/config/urls.py +++ b/root_url_init/config/urls.py @@ -15,10 +15,17 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, re_path +from django.views.generic import RedirectView import app.views urlpatterns = [ path('admin/', admin.site.urls), path('index/', app.views.index), + path('itopen/', app.views.itopen), + path('blog/', app.views.blog), + path('diary////', app.views.diary), + re_path('jenkins/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})', app.views.jenkins), + path('redirectTo', RedirectView.as_view(url="index/")), + path('new_blog/', app.views.new_blog), ] diff --git a/root_url_init/templates/itopen.html b/root_url_init/templates/itopen.html new file mode 100644 index 0000000000000000000000000000000000000000..14f4fad26db69af1e9fbd6e50e22b7971bbda9ff --- /dev/null +++ b/root_url_init/templates/itopen.html @@ -0,0 +1,11 @@ + + + + + + Itopen Html + + +
这是root路径
+ +