Django URL与视图

视图

在Django中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求的,视图函数处理之后,要给浏览器返回页面内容。视图一般都写在app的views.py中。并且视图的第一个参数永远都是request(一个 HttpRequest)对象。这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等。在视图中,一般是完成逻辑相关的操作。视图函数的返回结果必须是HttpResponseBase对象或者子类的对象。

news/views.py

from django.shortcuts import render
from django.http import HttpResponse

# from django.http import HttpResponse代表导入视图函数
# 导入的视图函数继承与HttpResponseBase对象
# 创建的函数必须是继承与request
# 视图函数的返回结果为HttpResponseBase或者子类的对象

def index(request):
    return HttpResponse("新闻页")

news/urls.py

# @Time : 2020/6/15 23:14 
# @Author : SmallJ 

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index)
]

URL映射

  • 为什么要去urls.py文件中寻找映射呢?
    • 是因为在settings.py文件中配置了ROOT_URLCONFurls.py,所有Django会去urls.py中寻找。
  • urls.py中我们所有的映射,都应该放在urlpatterns这个变量中。
  • 所有的映射不是随便写的,而是使用path函数或者是其他函数进行包装的。

视图写完后,要写URL进行映射,也即用户在浏览器中输入什么url的时候可以请求到这个视图函数。在用户输入了某个url,请求到我们的网站的时候,django会从项目的urls.py文件中寻找对应的视图。在urls.py文件中有一个urlpatterns变量,以后django就会从这个变量读取所有的匹配规则。匹配规则需要使用django.urls.path函数进行包裹,这个函数会根据传入的参数返回URLPattern或者URLResolver的对象。

book/vies.py

from django.shortcuts import render
from django.http import HttpResponse


def book(request):
    return HttpResponse("图书首页")

urls.py

"""book_data URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('news/', include('news.urls')),
    path('book/', include('book.urls'))
]

在这里插入图片描述

在这里插入图片描述

URL添加参数

注意:视图views.py文件中创建的视图函数传参时必须与urls.py文件中path路由的名字相对应

采用在url中使用变量的方式:在path的第一个参数中,使用<参数名>的方式可以传递参数。然后在视图函数也要写一个参数,视图函数中的参数必须和url中的参数名称保持一致。

book/views.py

from django.shortcuts import render
from django.http import HttpResponse


def book(request):
    return HttpResponse("图书首页")


def book_article(request, book_id):
    return HttpResponse("图书的id为:%s" % book_id)


book/urls.py

# @Time : 2020/6/15 23:29 
# @Author : SmallJ 

from django.urls import path
from . import views

urlpatterns = [
    path("", views.book),
    path("artilce/<book_id>", views.book_article)
]

在这里插入图片描述

URL中添加多个参数时

book/views.py

from django.shortcuts import render
from django.http import HttpResponse


def book(request):
    return HttpResponse("图书首页")


def book_article(request, book_id):
    return HttpResponse("图书的id为:%s" % book_id)


def book_author(request, book_name, book_age):
    # 当有多个参数的时候,可以使用括号括起来
    return HttpResponse("图书的作者为:%s,今年岁数为: %d" % (book_name, int(book_age)))

book/urls.py

# @Time : 2020/6/15 23:29 
# @Author : SmallJ 

from django.urls import path
from . import views

urlpatterns = [
    path("", views.book),
    path("artilce/<book_id>", views.book_article),
    path("author/<book_name>/<book_age>", views.book_author)
]

在这里插入图片描述

查询字符串的方式传递参数

request.GET.get()

  • 为什么会有两次GET.get。
  • 主要是因为源码中,GET的返回结果为QueryDict, 这是一种字典类型。
  • 使用get的好处在于当没有值的时候会返回None,字典操作。

news/views.py

from django.shortcuts import render
from django.http import HttpResponse

# from django.http import HttpResponse代表导入视图函数
# 导入的视图函数继承与HttpResponseBase对象
# 创建的函数必须是继承与request
# 视图函数的返回结果为HttpResponseBase或者子类的对象


def index(request):
    return HttpResponse("新闻页")


def news_article(request):
    news_id = request.GET.get('id')
    return HttpResponse("这是新闻页面的id页为:%s" % news_id)

news/urls.py

from django.shortcuts import render
from django.http import HttpResponse

# from django.http import HttpResponse代表导入视图函数
# 导入的视图函数继承与HttpResponseBase对象
# 创建的函数必须是继承与request
# 视图函数的返回结果为HttpResponseBase或者子类的对象


def index(request):
    return HttpResponse("新闻页")


def news_article(request):
    news_id = request.GET.get('id')
    return HttpResponse("这是新闻页面的id页为:%s" % news_id)

在这里插入图片描述

当存在多个查询字符串值时 news/views.py

from django.shortcuts import render
from django.http import HttpResponse

# from django.http import HttpResponse代表导入视图函数
# 导入的视图函数继承与HttpResponseBase对象
# 创建的函数必须是继承与request
# 视图函数的返回结果为HttpResponseBase或者子类的对象


def index(request):
    return HttpResponse("新闻页")


def news_article(request):
    news_id = request.GET.get('id')
    classify = request.GET.get('class')
    return HttpResponse("这是新闻页面的id页为:%s,这个是第%s类" % (news_id, classify))


注意:多个值查询使用&符号进行连接

在这里插入图片描述

Django内置的转换器

URL中传参的情况,传递参数是通过<>尖括号来进行指定的。并且在传递参数的时候,可以指定这个参数的数据类型,比如文章的id都是int类型,那么就可以写<int:id>

  • str : 非空的字符串类型。默认的转换器。但是不能包括斜杆。
  • int : 匹配任意的零或正数的整形。到视图函数中就是一个 int类型。
  • uuid :匹配uuid字符串。
  • path : 匹配非空的英文字符串,可以包括斜杆。
  • slug : 由英文中的横杆 -,或者下划线_连接英文字符或者数字而成的字符串。

book/urls.py

# @Time : 2020/6/15 23:29 
# @Author : SmallJ 

from django.urls import path
from . import views
from django.urls import converters
urlpatterns = [
    path("", views.book),
    path("artilce/<str:book_id>", views.book_article),
    path("author/<str:book_name>/<int:book_age>", views.book_author)
]

在这里插入图片描述

URL命名和反转URL

用Django开发web应用,经常会遇见从一个旧的url转向一个新的url。这种映射也许有规则,也许没有。但都是为了实现业务的需要。当有一天项目经理需要你更换url路由的时候,你就会需要使用到URL命名与反转更加方便实现。

  • url中配置REdirectView
  • view中通过HttpResponseRedirect实现redirect
  • 利用djangoredirects app实现
  • 命名和反转URL : from django.shortcuts import redirect, reverse
    • redirect : 为http中的函数跳转
    • reverse : 把url对应的视图函数的name值进行反转

front/views.py

from django.shortcuts import render
from django.http import HttpResponse

# redirect 为重定向的意思
from django.shortcuts import redirect, reverse

# 做个判断,就是当没有进行登录的时候,跳转到登陆页面
# 定义前端页面


def index(request):
    # 这里的get是以问号参数来传递
    username = request.GET.get('username')
    if username:
        return HttpResponse('前台首页')
    else:
        # redirect 为重定向
        # 如果写login的话就会把url的地址写死
        # reverse:反转
        # 主要就是通过reverse进行反转,把url对应的视图函数的name值进行
        return redirect(reverse('front:login'))


def login(request):
    return HttpResponse("前台登录页面")

front/urls.py

# @Time : 2020/6/14 16:15 
# @Author : SmallJ 


from django.urls import path
from front import views


# 命名空间
app_name = 'front'

# 配置路由
urlpatterns = [
    path("", views.index, name='index'),
    path("signin/", views.login, name='login')
]

在这里插入图片描述

cms/urls.py

# @Time : 2020/6/14 16:13 
# @Author : SmallJ 


from django.urls import path
from cms import views

# 命名空间
app_name = 'cms'

# 配置路由
urlpatterns = [
    path("", views.index, name='index'),
    path("login/", views.login, name='login')
]

cms/views.py

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.


# 定义后端模板
def index(request):
    return HttpResponse('后台页面')


def login(request):
    return HttpResponse("后台登陆界面")

在这里插入图片描述
在这里插入图片描述

应用命名空间

在多个app之间,有可能产生同名的url。这时候为了避免反转url的时候产生url产生混淆,可以使用应用命名空间,来做区分。定义应用命名空间非常简单,只要在appurls.py中定义一个叫做app_name的变量,来指定这个应用的命名空间即可。

from django.urls import path
from front import views


# 命名空间
app_name = 'front'

# 配置路由
urlpatterns = [
    path("", views.index, name='index'),
    path("signin/", views.login, name='login')
]

以后在做反转的时候就可以使用应用命名空间:url名称的方式进行反转。

login_url = reverse('font:login')

在这里插入图片描述

指定默认的参数

为什么需要使用默认的参数,在将来我们做网站开发的时候,将会遇到翻页的情况翻页的时候有的第一页的url 和 首月的url的内容是一致的
这是怎么回事呢?

  • 例如: 豆瓣的首页:https://movie.douban.com/top250
  • 通过规律发现豆瓣的首页: https://movie.douban.com/top250?start=0&filter=

book/views.py

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("这是图书首页")


def index_number(request, page_number):
    return HttpResponse("这是图书的第%s页" % page_number)

book/urls

# @Time : 2020/6/17 23:45 
# @Author : SmallJ 

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index),
    path("p/<page_number>/", views.index_number)
]

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
需求:我需要在不进行传参的时候显示图书的第一页,这该怎么实现呢?

  • 给参数一个默认值,在不进行传参的时候使用默认值。
  • 在给对应的参数多写一个对应的路由规则。

book/views.py

from django.shortcuts import render
from django.http import HttpResponse

"""
为什么需要使用默认的参数,在将来我们做网站开发的时候,将会遇到翻页的情况
翻页的时候有的第一页的url 和 首月的url的内容是一致的
这是怎么回事的
例如: 豆瓣的首页:https://movie.douban.com/top250
通过规律发现豆瓣的首页: https://movie.douban.com/top250?start=0&filter=
"""

# 给参数一个默认值,在不进行传参的时候使用默认值
# 在多写一个路由的规则


def index(request):
    return HttpResponse("这是图书首页")


def index_number(request, page_number=1):
    return HttpResponse("这是图书的第%s页" % page_number)

book/urls.py

# @Time : 2020/6/17 23:45 
# @Author : SmallJ 

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index),
    # 传的参数
    path("p/<int:page_number>/", views.index_number),
    # 默认的参数
    path("p", views.index_number)
]

在这里插入图片描述

在这里插入图片描述

re_path函数

有时候我们在写url匹配的时候,想要写使用正则表达式来实现一些复杂的需求,那么这时候我们可以使用re_path来实现。re_path的参数和path参数一摸一样,只不过第一个参数也就是route参数可以为一个正则表达式。

在正则表达式中定义变量,需要使用圆括号括起来。这个参数是有名字的,那么需要使用?P<参数的名字>。然后在后面添加正则表达式的规则。

正则表达式 作用
^ 匹配字符串开头的位置
$ 匹配字符串结尾的位置
from django.urls import path, re_path
from django.conf.urls import url
from . import views
# from django.conf.urls import url 这导入的url实际上返回return re_path
# re_path : 第一个参数也就是route参数可以成为正则表达式
# @Time : 2020/6/17 23:45 
# @Author : SmallJ 

from django.urls import path, re_path
from django.conf.urls import url
from . import views

# from django.conf.urls import url 这导入的url实际上返回return re_path
# re_path : 第一个参数也就是route参数可以成为正则表达式

urlpatterns = [
    path("", views.index),
    path("p/<int:page_number>/", views.index_number),
    path("p", views.index_number),
    # 正则表达式
    # ^ 开始  $结尾
    re_path(r"^article/(?P<year>\d{4})/", views.year_index),
    re_path(r"^article/(?P<month>\d[1-12])/", views.month_index)
]

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37662827/article/details/106816950