一,url路由path及转化器
URL(uniform Resoure Locator)统一资源定位符,是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址,互联网上的每个文件都有唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
设置好url,用户才能访问
1,URL的格式:
例如:http://127.0.0.1:8000/hello/
解释:
schema://host[:port#]/path/.../[?query-string][#anchor]
schema:指定使用的协议(如:http,https,ftp)
host:Http服务器的IP地址或者域名
port:端口号,http默认是80端口
path:访问资源的路径
query-string:发送给http服务器的数据
anchor:锚点
2,urls.py的作用
URL配置(URLconf)就像是Django所支撑网站的目录。它的本质是URL模式以及URL模式调用的视图函数之间的映射表。以这样的方式告诉Django,对于哪个URL调用那段代码。URL的加载就是从配置文件中开始
例如:在项目下urls.py文件:
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path("abc/",views.hello),
path("ab/", views.hello_python),
path("ab//", views.hello_name),#获取变量name
]
views.py文件:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def hello(request):
return HttpResponse("123344")
def hello_python(request):
return HttpResponse("HELLO PYTHON!!")
def hello_name(request,name):
return HttpResponse("hello %s"%name)#传进去变量name
3,path基本规则
path('test//',views.test)
1:使用尖括号(<>)从url中捕获值。包含一个转化器类型(converter type)没有转化器,将匹配任何字符串,当然也包括了 / 字符
2:当前面的url匹配成功后就会调用后面的视图函数
4,转化器:
path('test/int:xx/',views.test3)
path("/", views.hello_name),
#类型转换(path已经提供好的转换器int)
默认的转换器:
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符
二,re_path及incloude例子
1,正则表达式对应的要用re_path(类型转化器)
re_path("(?p\d+)",views.hello_name),#正则表达式写法(转换器)
#url.py
re_path('^hello/$',views.test5),
re_path('^hello/(?P[0-9]+)/',views.test6),
#views.py
def test5(request):
return HttpResponse('这是用的re_path设置的')
def test6(request,yy):
print(yy,type(yy))
return HttpResponse('hello %s'%yy)
2,incloude分配路由:
一个project有一个总的urls.py各个app也可以自己建立自己的urls.py用include()函数在project的urls.py文件进行注册
主目录下分配路由到其他目录urls.py
from django.contrib import admin
from django.urls import path,include
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include('book.urls')),
]
path('book/', include("book.urls")),#给APP分配路由
分路由下配置url.py
from django.urls import path
from . import views
urlpatterns = [
path('index/', views.hello),
]
APP下的视图文件views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def hello(request):
return HttpResponse("这是book主页")
有变量也可用在app里(与主项目用法相同)
def hello(request,book_name,**kwargs):
print(book_name)
return HttpResponse("这是book主页")
path('index//', views.hello),
三,kwarg,name,redirect,reverse页面重定向
1,kwargs的作用
传递一个Python 字典作为额外的参数传递给视图函数。
# 主urls.py文件
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls), path('book/',include('book.urls'),{'switch':'true'}),
]
视图函数中可以通过关键字参数获取到
# APP books里面的views.py
from django.http import HttpResponse
import datetime
def index(request,**kwargs):
if kwargs.get('switch') == 'true':
print(datetime.datetime.now())
return HttpResponse('这个book的首页!!')
Kwargs为字典类型可以传递额外的参数到views中使用include的时候需要统一给下面的url一些参数的时候显得尤其有用
2,name
name参数可以给这个url取一个合适的名字。通过给url取名字,以后在view或者模板中使用这个URL,就只需要通过这个名字就可以了。这样做的原因是防止url的规则更改,会导致其他地方用了这个url的地方都需要更改,但是如果取名字了,就不要做任何改动了。
给一个匹配的url地址取名字一般用于模板,也可以使用reverse进行页面重定向
页面重定向
from django.shortcuts import render,redirect
from django.http import HttpResponse
# Create your views here.
def article(request,**kwargs):
return redirect("/book/article_new/") #页面跳转
return HttpResponse("这是老的页面")
def article_new(request,**kwargs):
return HttpResponse("这是新的页面")
from django.urls import path
from . import views
urlpatterns = [
path('article/', views.article),
path('article_new/', views.article_new),
redirect是重定向,reverse是将url的name解析成url本身的函数
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
# Create your views here.
def article(request,**kwargs):
return redirect(reverse("new_article"))
return HttpResponse("这是老的页面")
def article_new(request,**kwargs):
return HttpResponse("这是新的页面")
from django.urls import path
from . import views
urlpatterns = [
path('article/', views.article),
path('article_new/', views.article_new,name="new_article"),
#name与path匹配
]
四,模板渲染
Django怎样去调用漂亮的HTML前端页面呢?
1.直接将html字符串硬编码HttpResponse中
def index_1(request):
return HttpResponse("hello django world!")
2.django.template.loader 定义了函数以加载模板
1.在主目录下创建一个templates目录用来存放所有的html的模板文件.2.templates目录里面在新建各个以app名字命名的目录来存放各个app中模板文件.
2,将我们的设置好的存放html模板的templates目录路径添加到DIRS中
#在setting.py中找到templates,修改"DIRS"
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
...
render方法上传(views.py文件)
from django.template.loader import get_template
def index(request,**kwargs):
t=get_template("book/index.html")
html=t.render()
return HttpResponse(html)
3.使用render进行渲染。
只用render 方法上传**
def index(request,**kwargs):
return render(request,"book/index.html")
模板里传参
#有变量name渲染(views.py)
def index(request,name,**kwargs):
render(request,"book/index.html",context={"name":name})
#urls.py
from django.urls import path
from . import views
urlpatterns = [
path('index//', views.index),
]