在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)
]
urls.py
文件中寻找映射呢?
settings.py
文件中配置了ROOT_URLCONF
为urls.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'))
]
注意:视图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/" , views.book_article)
]
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/" , views.book_article),
path("author//" , views.book_author)
]
request.GET.get()
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))
注意:多个值查询使用&符号进行连接
URL中传参的情况,传递参数是通过<>尖括号来进行指定的。并且在传递参数的时候,可以指定这个参数的数据类型,比如文章的id都是int类型,那么就可以写
-
,或者下划线_
连接英文字符或者数字而成的字符串。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/" , views.book_article),
path("author//" , views.book_author)
]
用Django开发web应用,经常会遇见从一个旧的url转向一个新的url。这种映射也许有规则,也许没有。但都是为了实现业务的需要。当有一天项目经理需要你更换url路由的时候,你就会需要使用到URL命名与反转更加方便实现。
url
中配置REdirectView
view
中通过HttpResponseRedirect
实现redirect
django
的redirects app
实现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产生混淆,可以使用应用命名空间,来做区分。定义应用命名空间非常简单,只要在app
的urls.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的内容是一致的
这是怎么回事呢?
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//" , 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//" , views.index_number),
# 默认的参数
path("p", views.index_number)
]
有时候我们在写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//" , views.index_number),
path("p", views.index_number),
# 正则表达式
# ^ 开始 $结尾
re_path(r"^article/(?P\d{4})/" , views.year_index),
re_path(r"^article/(?P\d[1-12])/" , views.month_index)
]