• 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})
  • 相关阅读:
    [nRF51822] 1、一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO
    [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar
    [自己动手玩黑科技] 1、小黑科技——如何将普通的家电改造成可以与手机App联动的“智能硬件”
    [安卓] 17、一个简单的例子学安卓侧滑设计——用开源slidingmenu
    [安卓] 16、ListView和GridView结合显示单元实现自定义列表显示效果
    mysql常用处理时间的相关函数
    Mysql中HAVING的相关使用方法
    mysql中常见正则表达式的应用
    Linux系统模拟发送HTTP的get和post请求
    mysql删除字符串的前后的空格
  • 原文地址:https://www.cnblogs.com/bear905695019/p/9136929.html
Copyright © 2020-2023  润新知