Django-02-路由器配置和模版渲染方式
一、路由配置
1.urls.py
├── hello_django
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
urls.py文件用来声明url,类似于目录,是路由的配置。一个url对应一个视图函数。url的加载就是从该文件中开始。
2.解析过程:
Django会从urlpatterns里顺次读取元素,每个元素是方法url调用后返回的结果。django传给url路由要处理的地址,该地址是被去掉主机地址及之后的一个“/”的剩余部分:
例如: http://127.0.0.1:8000/hello/
经处理后的剩余部分就是:hello/
然后把该剩余部分与url方法的第一个参数进行正则匹配,如何匹配成功,则执行url的第二个参数指定的方法(该方法一般放在views.py中,主要功能的实现具体业务逻辑)。
3.路由配置中url,里面可以配置四个参数,1.路径(必须)2.对应的视图函数(必须)3.关键字参数,是一个字典,用于传参(可加可不加)4.name(给url命名,便于引用,可加可不加)
二、示例:
1.路由基本配置
# hello_django/urls.py: from django.conf.urls import include,url from django.contrib import admin from books import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello/python/$', views.hello_python), url(r'^hello/php/$', views.hello_php), url(r'^hello/([a-z]+)/$',views.hello_course), url(r'^add/(\d+)/(\d+)/$', views.add), url(r'^hello/(?P<name>\w+)/(P<num>\d+)$',views.hello_django), ]
# books/views.py from django.http import HttpResponse def hello_python(request): return HttpResponse('Hello python!') def hello_php(request): return HttpResponse('Hello php!') def hello_course(request, course): return HttpResponse('Hello %s' % course) def add(request,a,b): c = int(a)+int(b) return HttpResponse(str(c)) def hello_django(request, name, num): return HttpResponse('Hello %s %s' % (name, num))
1、捕获位置参数(可变参数):在url函数中,第一个正则表达式使用()括号进行捕获参数.
2、捕获关键字参数:在url函数中,第一个正则表达式使用(?P<keyword>)
进行捕获。
注意事项:
参数类型是字符串类型,所以,如果使用数字类型,需要使用int函数转换成int类型。
如果像url(r'^hello/(\w+)/(P<num>\d+)$',views.hello_django),既包含可变参数,又包含关键字参数,后台将捕获不到可变参数,
如果包含关键字参数,其他参数也要设置为关键字参数例如 url(r'^hello/(?P<name>\w+)/(P<num>\d+)$',views.hello_django)
2.include
一个project有一个总的urls.py,各个app也可以自己建立自己的urls.py,不过都需要使用include()函数在project的urls.py文件进行注册。(方便管理)
#hello_django/urls.py 主url文件 from django.conf.urls import url,include from django.contrib import admin #路由分配 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^book/', include('book.urls')), url(r'^music/', include('music.urls')), ]
#music/urls.py 应用music的url文件 from django.conf.urls import url from . import views urlpatterns = [ url(r'^hello/$', views.index, {'state':'true'}), url(r'^hello_classical/$', views.hello_classical, name = 'classical'), url(r'^hello_pop/$', views.hello_pop, name = 'pop'), url(r'^hello_music/$', views.index_2), url(r'^hello_new_music/$', views.index_3), ]
Include注意事项:
1.到达django来的时候,已经有域名和反斜杠了,拿本机地址为例,已经有http://127.0.0.1/这个样子了,所以主url中都不需要以/开头。
2.子url在匹配的时候,其实就是字符串的匹配,一层套一层的。
3.主Url匹配,开始的地方不需要加反斜杠。
原因是:因为django已经给域名后面加了一个正斜杠,所以不需要再加,否则将匹配不到正确的URL。
4.主url后面要加正斜杠。
5.app的url,前面不要加正斜杠。
6.主url后面不要加$符号,
7.子app的url,后面要加$符号。
3.关键字参数‘**kwarg’
传递一个Python 字典作为额外的参数传递给视图函数。django.conf.urls.url() 函数可以接收一个可选的第三个参数,它必须是一个字典,表示想要传递给视图函数的额外关键字参数。
#hello_django/urls.py 主url文件 from django.conf.urls import include,url from django.contrib import admin from .import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^books/',include('books.urls'),{'switch':'true'}), ]
# book/view.py APP books里面的view文件 from django.http import HttpResponse import datetime def index(request,**arg): if arg.get('switch') == 'true': print(datetime.datetime.now()) return HttpResponse('<h1>这是首页</h1>')
4.路由设置name
给一个匹配的url地址取名字,一般用于模板,也可以使用reverse进行页面重定向,使用方法:reverse(name)
# book/url.py APP books里面的URL文件 from django.conf.urls import url from . import views urlpatterns =[ url(r'^$',views.index), url(r'article/$', views.article,name='books_article'), url(r'^(?P<books>\w+)/$',views.book_list,name='books_lists'), url(r'^article_new/$', views.article_new,name='books_article_new'), ]
# book/views.py APP book里面的view文件 from django.shortcuts import render,reverse,redirect from django.http import HttpResponse # Create your views here. def article(request,**kwargs): if kwargs.get('switch') == 'true': return redirect(reverse('book_article_new')) return HttpResponse('这是文章首页') def article_new(request,**kwargs): return HttpResponse('这是新的文章首页')
reverse(name, arg=[aaa])reverse中以列表的方式接收和传递参数
from django.conf.urls import url from . import views urlpatterns = [ url(r'old/(?P<lala>\d+)', views.old, name = 'book_old'), url(r'new/(?P<lala>\d+)', views.new, name = 'book_new'), ]
from django.shortcuts import render,redirect,reverse from django.http import HttpResponse def old(request, aaa): return redirect(reverse('book_new'), args = [aaa]) def new(request, aaa): return HttpResponse('This is new!')
二、模版渲染
1.setting.py中模板路径配置:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
用join方法拼成的路径 'DIRS': [os.path.join(BASE_DIR, 'templates')], //templates是默认的名称
2.HttpResponse
我们可以通过HttpResponse把字符串解析成html
from django.shortcuts import render,redirect,reverse # Create your views here. from django.http import HttpResponse def index(request): return HttpResponse('hello python')
3.
1.该函数使用给定的名称加载模板并返回一个Template
对象.get_template()
尝试获取每个模板直到有一个成功满足。
#get_template()获取html对象,render加载html对象 from django.template.loader import get_template def index_2(request,bn): t = get_template('index.html') html = t.render({'books_name':bn}) return HttpResponse(html)
2.第二种用render直接渲染,更简洁,也更常用
#使用render进行渲染。 from django.shortcuts import render def index_3(request,bn): return render(request,'index.html',{'booksname':bn})