django框架学习2:url的使用 url模块化

1.新建django项目:

django-admin startproject first_project

2.新建蓝图:

django-admin startapp book

视图和URL连接的相关解释

视图内容
  • 位置:app的views.py内
  • 参数:request(HttpRequest对象)
  • 功能:完成逻辑操作,可以通过request来接收到这些数据,然后 存储到数据库中,最后再把执⾏的结果返回给浏览器。
  • 返回:返回结果必 须是HttpResponseBase对象或者⼦类的对象,
URL映射
  • 简述:视图写完后,要与URL进⾏映射,也即⽤户在浏览器中输⼊什么url的时候可以 请求到这个视图函数。
  • 位置:项⽬的urls.py⽂件
  • 参数:urlpatterns变量,从该变量定义所有的匹配规则,匹配规 则需要使⽤django.urls.path函数进⾏包裹,这个函数会根据传⼊的参数返回 URLPattern或者是URLResolver的对象。
  • 添加参数的URL:通过尖括号定义一个参数,满足URL前导相同,只有最后的ID不同的内容。
  • URL模块化:可以在app内部包含⾃⼰的url匹配规则,⽽在项⽬的urls.py中再统 ⼀包含这个app的urls。使⽤这个技术需要借助include函数。
  • URL命名和反转:path("",views.index,name=“index”),因为在项⽬开发的过程中URL地址可能经常变动,如果写死会经常去修改
  • 应用命名空间和实例命名空间
  • re_path函数:在写url匹配的时候,想要写使⽤正则表达式来实现⼀些复杂的需 求,那么这时候我们可以使⽤re_path来实现。re_path的参数和path参数⼀模 ⼀样,只不过第⼀个参数也就是route参数可以为⼀个正则表达式。

项目

两种获取URL的方式:
蓝图book中的views.py

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.

def book(request,book_id):
    return HttpResponse('图书第%s本'%book_id)

#def book(request):
#    return HttpResponse('图书第%s本')

def book_detail(request):
    book_detail = request.GET.get('book_detail')
    return HttpResponse('图书第%s页' % book_detail)

urls.py

from django.contrib import admin
from django.urls import path
from book import views

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('book/',views.book),
    path('book/<book_id>',views.book),
    path('book_detail/',views.book_detail)
]

对于第一种

def book(request,book_id):
    return HttpResponse('图书第%s本'%book_id)
# 对应path('book/<book_id>',views.book)

在这里插入图片描述
对于:

def book_detail(request):
    book_detail = request.GET.get('book_detail')
    return HttpResponse('图书第%s页' % book_detail)
# path('book_detail/',views.book_detail)

对应的访问方式:
在这里插入图片描述
url分层管理与模块化:
目前的url管理就是有一个导入一个,比如有多个蓝图APP,就要分多次导入

from news import views as book_views
from book import views as book_views

但是这样不方便管理,也不便查找
此时就用到了url的分层管理:
在news和book中各写一个urls
在总的urls中引入分的urls即可,不必再引入多个不同的views和url了,只需要引入每个蓝图中的一个url:
此时,以book中的views为例,
views:

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.

def book(request,book_id):
    return HttpResponse('图书第%s本' % book_id)

# def book(request):
#     return HttpResponse('图书第%s本')

def book_detail(request):
    book_detail = request.GET.get('book_detail')
    return HttpResponse('图书第%s页' % book_detail)

book/urls

from django.urls import path
from . import views
from django.urls import converters

urlpatterns = [
    path('<int:book_id>',views.book),
    path('book_detail/',views.book_detail),
]

# 127.0.0.1:8000/book/1
# 127.0.0.1:8000/book/book_detail/?book_detail=1

主工程中的urls:

from django.contrib import admin
from django.urls import path,include

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

其中的查找顺序:
主工程的urls向book/urls查找,book/urls在本工程内的views内查找

模块化
  • 1.重定向: redirecct:重定向,如果你不符合访问这个路由的要求,就跳转到另一个页面去等做完了之后再访问当前路由
- from django.shortcuts import render,redirect

front\urls.py

from django.urls import path
from . import views

app_name = 'front'
# 命名空间
urlpatterns = [
    path('',views.index),
    #path('login/',views.login),
    path('sign/',views.login,name='login'),
]

front\views.py

from django.shortcuts import render,redirect
# redirecct:重定向,如果你不符合访问这个路由的要求,就跳转到另一个页面去
# 等做完了之后再访问当前路由
from django.http import HttpResponse
# Create your views here.

def index(request):
    name = request.GET.get('name')
    if name:
        return HttpResponse('前台首页')
    else:
        return redirect('front:login')
        # return redirect('/login')

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

注:path(‘login/’,views.login),这样对应的是return redirect(’/login’),这里的/login是一致的,如果在定义时定义为

app_name = front
 path('sign/',views.login,name='login'),

则需要返回为:

return redirect('front:login')

其中的app_name:是该应用命名空间的名称,是唯一的,用于区分多个APP

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值