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