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.加载模板  

    get_templatetemplate_nameusing = None

    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})

 

posted @ 2018-06-05 03:21  17-王晶龙-58  阅读(112)  评论(0编辑  收藏  举报