zoukankan      html  css  js  c++  java
  • 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})
  • 相关阅读:
    mysql 函数 存储过程 事件(event) job 模板
    protobuf 无proto 解码 decode 语言 java python
    mitmproxy fiddler 抓包 填坑
    android adb 常用命令
    android机器人 模拟 踩坑过程
    RabbitMQ添加新用户并支持远程访问
    Windows下RabbitMQ安装及配置
    Java mybatis mysql 常用数据类型对应关系
    easyExcel 踩坑
    linux防火墙查看状态firewall、iptable
  • 原文地址:https://www.cnblogs.com/bear905695019/p/9136929.html
Copyright © 2011-2022 走看看