Python框架Django -- 03 视图

一、URLconf


        用户在通过浏览器访问网址请求网站的时候,是通过url找到对应的函数进行执行,而Django中的url配置在与项目同名的文件夹下的settings.py中进行配置


1、配置


(1)、test1/settings.py配置文件


settings.py中默认已经通过ROOT_URLCONF指定了url的配置,指向的是test1下的urls.py文件:




(2)、test1/urls.py中配置项如下:




注意:

    

        在test1/urls.py中进行包含配置,在各自应用中创建对应的urls.py,在每个应用下的urls.py文件中进行具体的配置。


        定义urlpartterns列表,存储url( )对象,这个列表名称是固定的。


2、url定义的语法


url( )对象被定义在django.conf.urls包中,由两种语法结构


(1)、语法一:包含,在项目同名文件夹下的urls.py中包含其他应用的urls.py


        在自定义的应用中创建一个urls.py文件来定义url( ),然后在项目同名文件夹下的urls.py中将自定义的urls.py引入,这样做的目的是将urls.py配置到应用内部,数据更清晰且易于维护。


test1/urls.py中引入booktest/urls.py的语法


url(r'^',include('应用名称.urls')),
# 此处的urls指的是各自应用(booktest)中urls.py文件的名称,如果是urls.py,即为urls


(2)、语法二:定义,指定URL和视图函数的对应关系


在各自应用内部创建urls.py,指定请求地址与视图的对应关系,格式如下:


url(正则,'视图函数名称')

示例:


booktest/urls.py中创建首页的url:


from django.conf.urls import url
from booktest import views
urlpatterns=[
    url(r'^$',views.index),
]


注意:正则部分推荐使用r,表示字符串不转义,这样在正则表达式中使用\只写一个就可以。 不能在开始加反斜杠,推荐在结束加反斜杠,因为浏览器的url在结尾加\和不加都一样。


3、获取url中携带的参数值


请求的url被看作是一个普通的python字符串,进行匹配不包括域名、get或者post的请求参数,如:请求地址如下:


http://localhost:8080/detail/1?a=10


以上请求地址中,与url( )函数中正则匹配的字符串只有:detail/


如果想在请求的url中携带RESTFUL风格的参数,需要在url( )函数的正则表达式中是用分组,即使用()号,分为:位置参数、关键字参数。


注意:两种参数方式不要混合使用,在一个正则表达式中只能使用一种参数方式。


(1)、位置参数


直接使用()号,通过位置参数传递给视图


如访问的url 为: http://localhost:8000/show_books/1?a=10


在url( )函数中的正则表达式写法为:


url(r'^detail(\d+)/$',views.show_books),


views.py中对应的函数写法为:


def show_books(request, id):    # 此处获取的id为1
    return HttpResponse('show_books')


(2)、关键字参数


使用关键字参数,则在url()函数中的正则表达式分组是,为每个组命名


如访问的url为:http://localhost:8000/delete/1?a=10


在url()函数的正则表达式写法为:


url(r'^delete(?P<id1>\d+)/$',views.show_book),


在views.py中的函数写法为:


def show_arg(request,id1):
    return HttpResponse('show %s'%id1)


注意:如果使用关键字参数的话,则views.py中对应的函数的参数名称必须和正则表达式中组的命名一直,否则将报错。


二、视图


1、什么是视图


        视图就是python中的函数,视图一般被定义在"应用/views.py"文件中,即本例的"booktest/views.py"中。


       视图必须返回一个HttpResponse对象或者子对象作为响应。响应可以是一张网页的HTML内容,也可以是一个重定向(redirect)函数,或者一个404错误等。


        视图的第一个参数必须是HttpRequest对象,其他参数还可能包括:关键字参数或者位置参数(二者取其一)

            

2、内置错误视图


(1)、内置错误视图


        Django内置处理HTTP错误的视图,主要错误及视图包括:

 

                404:page not found 视图


                500:server error 视图


        如果想看到错误视图,而不是调试信息,需要修改"test/settings.py"文件中的DEBUG项配置信息




(2)、404错误及视图


        将请求地址进行url匹配之后,没有找到匹配的正则表达式,则调用404视图,这个视图会调用404.html模版进行渲染,视图传递变量request_path给模版,表示导致错误的URL。


在templates中创建404.html


<html>
<head>
    <title></title>
</head>
<body>
找不到了
<hr/>
{{request_path}}
</body>
</html>


在浏览器中输入如下网址:


http://localhost:8000/test/


运行效果如下:




(3)、500错误及视图


        在视图中代码运行报错将会发生500错误,调用内置错误视图,使用templates/500.html模版进行渲染。


三、HttpRequest对象


1、HttpRequest对象


        服务器接收到HTTP请求后,会根据报文创建HttpRequest对象,这个对象不需要我们手动创建,直接使用服务器构建好的对象即可。视图函数中的第一个参数必须是HttpRequest对象,该对象类定义在django.http模块中。


2、属性


        path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。


        method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。


                在浏览器中给出地址发出请求采用get方式,如超链接。

                

                在浏览器中点击表单的提交按钮发起请求,如果表单的method设置为post则为post请求。


                使用post请求接收参数时,需要在settings.py中进行一下设置:




        encoding:一个字符串,表示提交的数据的编码方式。


                如果为None则表示使用浏览器的默认设置,一般为utf-8。


                这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。


        GET:QueryDict类型对象,类似于字典,包含get请求方式的所有参数。


        POST:QueryDict类型对象,类似于字典,包含post请求方式的所有参数。


        FILES:一个类似于字典的对象,包含所有的上传文件。


        COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串。


        session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见"状态保持"。


3、QueryDict对象

        定义在django.http.QueryDict


        HttpRequest对象的属性GET、POST都是QueryDict类型的对象


        与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况


        方法get():根据键获取值


        如果一个键同时拥有多个值将获取最后一个值


        如果键不存在则返回None值,可以设置默认值进行后续处理


dict.get('键',默认值)
可简写为
dict['键']


        方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值


        如果键不存在则返回空列表[],可以设置默认值进行后续处理


dict.getlist('键',默认值)


4、GET属性


        Django中可以使用HttpRequest对象的GET属性获得get方式请求的参数,GET属性是一个QueryDict类型的对象,键和值都是字符串类型。


5、POST属性


        Django中可以使用HttpRequest对象的POST属性获得post方式请求的参数,POST属性是一个QueryDict类型的对象。


6、GET和POST方式提交参数获取示例


(1)、在views.py中创建函数




(2)、在booktest/urls.py中配置对应的url( )




(3)、在模版目录中编写index.html模版、show_get_args.html模版、show_post_args.html模版


index.html


<html>
    <head>
        <title>首页</title>
    </head>
    <body>
    
        3.提交数据的两种方式:
        get方式:<br/>
        <a href="/show_req_arg/?a=1&b=2&c=python">get方式提交数据</a><br/><br/>
        post方式:<br/>
        <form method="post" action="/show_req_arg/">
           姓名:<input type="text" name="uname"><br/>
           性别:
                男<input type="radio" name="gender" value="男"/>
                女<input type="radio" name="gender" value="女"/><br/>
           爱好:
                吃饭<input type="checkbox" name="hobby" value="吃饭"/>
                睡觉<input type="checkbox" name="hobby" value="睡觉"/>
                打豆豆<input type="checkbox" name="hobby" value="打豆豆"/><br>
           <input type="submit" value="提交">
        </form>
        <br/>
    </body>
</html>


show_get_args.html


<html>
    <head>
        <title>GET方式提交数据</title>
    </head>
    <body>
        a:{{ a }}<br/>
        b:{{ b }}<br/>
        c:{{ c }}<br/>
    </body>
</html>


show_post_args.html


<html>
    <head>
         <title>POST方式提交数据</title>
    </head>
    <body>
        name:{{ name }}<br/>
        gender:{{ gender }}<br/>
        hobbys:
        <ul>
            {% for hobby in hobbys %}
                <li>{{ hobby }}</li>
            {% endfor %}
        </ul>
    </body>
</html>


(4)、启动服务,访问index页面,分别点击get和post请求,查看页面效果




四、HttpResponse对象


1、什么是HttpResponse


        视图在接收请求并处理之后,必须返回HttpResponse对象或者子对象。在django.http模块中定义了HttpResponse对象的API。HttpRequest对象由django框架创建,HttpResponse对象由调用者(开发人员)创建。


2、属性


        content:表示返回的内容。


        charset:表示response采用的编码字符集,默认为utf-8。


        status_code:返回的HTTP响应状态码。


        content-type:指定返回数据的的MIME类型,默认为'text/html'。


3、方法


        _init_:创建HttpResponse对象后完成返回内容的初始化。


        set_cookie:设置Cookie信息。

                

set_cookie(key, value='', max_age=None, expires=None)


                cookie是网站以键值对格式存储在浏览器中的一段纯文本信息,用于实现用户跟踪。


                max_age是一个整数,表示在指定秒数后过期。


                expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期。


                max_age与expires二选一。


                如果不指定过期时间,在关闭浏览器时cookie会过期。


        delete_cookie(key):删除指定的key的Cookie,如果key不存在则什么也不发生。


        write:向响应体中写数据。


4、HttpResponse应用示例


(1)、直接返回数据


def index(request):
    return HttpResponse('直接返回到浏览器的数据')


(2)、调用模版


from django.template import RequestContext,loader

def index(request):
    # 加载模版
    temp = loader.get_template('booktest/index.html')

    # 构造上下文
    context = RequestContext(request, {'a': 'hello'})

    # 使用上下文渲染模版,生成字符串后返回
    return HttpResponse(temp.render(context))


(3)、调用模版简写函数render


      每次调用模板时都要执行加载模版、构造上下文、渲染三个步骤,为了简化操作,Django定义了render()函数封装了以上三个步骤的代码,定义在django.shortcuts模块中。


from django.shortcuts import render

def index(request):
    return render(request, 'booktest/index3.html', {'h1': 'hello'})


5、子类JsonResponse


(1)、JsonResponse以及ajax介绍


        在浏览器中使用javascript发起ajax请求,返回json格式的数据。类JsonResponse继承自HttpResponse,被定义在django.http模块中,创建对象时接收字典作为参数。


        在HTML中使用ajax需要导入js文件,导入导入js文件需要在test1/settings.py中配置静态文件的路径,配置信息如下:




        ajax执行流程


                ①、发起请求


                ②、服务器端视图函数执行


                ③、执行回调函数


(2)、html页面调用ajax发送请求示例


在views.py中定义视图函数




在urls.py中配置url( )函数




在test1下创建static/js目录,用来放置js文件




创建json.html


<html>
    <head>
        <title>json</title>
        <script src="/static/js/jquery-1.12.4.min.js"></script>
        <script>
            $(function () {
                $('#btnJson').click(function () {
                    $.get('/json2/',function (data) {
                        ul=$('#jsonList');
                        ul.append('<li>'+data['h1']+'</li>')
                        ul.append('<li>'+data['h2']+'</li>')
                    })
                });
            });
        </script>
    </head>
<body>
    <input type="button" id="btnJson" value="获取json数据">
    <ul id="jsonList"></ul>
</body>
</html>


浏览器运行测试




6、子类HttpResponseRedirect


        当一个逻辑处理完成之后,不需要向浏览器呈现数据,而是转回到其他的请求(添加成功跳转到列表页面),此时就要模拟一个用户的请求,从一个视图函数转到另一个视图函数,就称之为重定向(redirect)。


(1)、重定向中views.py视图函数示例


from django.http import HttpResponseRedirect

# 定义重定义向视图,转向首页index
def red(request):
    return HttpResponseRedirect('/index')

(2)、重定向简写函数redirect示例


from django.shortcuts import redirect

def red1(request):
    return redirect('/index')


五、状态保持


1、Cookie


(1)、cookie的特点


        Cookie以键值对的格式进行信息的存储。


        Cookie基于域名安全,不同域名的Cookie是不能互相访问的,如访问itcast.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息。


        当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有Cookie信息提交给网站服务器。


(2)、设置cookie


在views.py中编写视图函数




配置urls.py中的url( )函数




浏览器访问,开发者工具查看cookie信息




(3)、读取cookie


Cookie信息被包含在请求头中,使用request对象的COOKIES属性访问。


创建cookie_get视图函数




配置url




浏览器访问




2、session


        对于敏感、重要的信息,建议要储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息。在服务器端进行状态保持的方案就是Session。


(1)、启用session


Django框架默认已经启动了session,启用session的配置在settings.py中,配置如下:




注意:禁用session只需要将session中间件从MIDDLEWARE_CLASSES配置项中删除即可


(2)、储存方式


        在settings.py中的SESSION_ENGINE配置项可以设置session数据的存储方式(存储在数据库、缓存、redis中等)


        ①、存储在数据库中,默认是将session存储在数据库中,以下配置可写可不写


SESSION_ENGINE='django.contrib.sessions.backends.db'


        存储在数据库中,需要在settings.py中的INSTALLED_APPS中安装Session应用,配置如下:




        迁移之后,在数据库中会创建出存储session的表:




        ②、存储在缓存中:存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。


SESSION_ENGINE='django.contrib.sessions.backends.cache'


        ③、混合存储:优先从本机内存中存取,如果没有则从数据库中存取。


SESSION_ENGINE='django.contrib.sessions.backends.cached_db'


(3)、依赖于cookie


        在使用Session后,会在Cookie中存储一个sessionid的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到sessionid后,会根据这个值找出这个请求者的Session。存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置。


(4)、对象及方法


通过HttpRequest对象的session属性进行会话的读写操作。


①、以键值对的格式写session


request.session['键']=值


②、根据键读取值


request.session.get('键',默认值)


③、清除所有session,在存储中删除值部分


request.session.clear()


④、清除session数据,在存储中删除session的整条数据


request.session.flush()


⑤、删除session中指定的键及值,在存储中只删除某个键及对应的值


del request.session['键']


⑥、设置会话的超时时间,如果没有指定过期时间,默认时间是两周


request.session.set_expiry(value)


        如果value是一个整数,会话将在value秒没有活动后过期。


        如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期。


        如果value为None,那么会话永不过期。


(5)、示例


①、写session


创建session_set视图函数


# 写session操作
def session_set(request):
    """写session操作"""
    request.session['h1'] = 'hello'
    return HttpResponse('写Session')


配置url函数




运行服务器,查看浏览器效果




查看MySQL数据库中的session数据






②、读session


创建session_get视图函数


# 读session操作的视图
def session_get(request):
    """读取session中的数据"""
    h1 = request.session.get('h1')
    return HttpResponse(h1)


配置url函数




运行服务器,查看浏览器效果




③、删除session


创建session_del视图函数


# 删除session
def session_del(request):
    """删除session的操作"""
    del request.session['h1']
    return HttpResponse('删除成功')


配置url


# 删除session操作的url
url(r'^session_del$', views.session_del),


启动服务,访问浏览器,查看数据库session数据





3、使用redis存储session


会话还支持文件、纯cookie、Memcached、Redis等方式存储


(1)、安装redis的包,开启redis


pip install django-redis-sessions==0.5.6


(2)、修改settings.py文件,添加如下内容


SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 2
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'


(3)、编写session_redis视图函数


(4)、配置url


(5)、启动服务,访问浏览器,查看redis数据库中数据


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种高级编程语言,而Django是一个使用Python编写的Web框架。它们可以一起使用来开发功能强大的Web应用程序。 Bootstrap是一个开源的前端框架,它提供了一套美观和响应式的页面设计元素和样式。它的主要目标是简化开发者在Web上创建美观和易于使用的页面的工作。 Bootstrap-Table是基于Bootstrap框架的一个强大的jQuery表格插件。它提供了丰富的功能和选项,使开发者能够很容易地在Web应用程序中创建和管理数据表格。Bootstrap-Table允许开发者使用少量的HTML和JavaScript代码来自定义和配置表格的样式和功能。 在Python Django中使用Bootstrap-Table可以帮助我们更轻松地创建和管理数据表格。我们可以将Bootstrap-Table与Django的模型和视图结合使用,从数据库中获取数据并在Web应用程序中显示它们。通过使用Bootstrap-Table的功能,我们可以对表格进行排序、分页、筛选等操作。 使用Bootstrap-Table的一个例子是在Django视图中使用它来显示查询结果。我们可以通过在模板中引入Bootstrap-Table的样式和脚本文件,然后在视图中将查询结果传递给模板。在模板中,我们可以使用Bootstrap-Table的数据属性和选项来定义表格的样式和功能。最后,我们可以使用Bootstrap-Table的JavaScript方法来初始化和渲染表格,并在页面上显示查询结果。 总而言之,Python Django与Bootstrap-Table的结合可以让开发者更轻松地创建和管理数据表格,从而为Web应用程序提供更好的用户体验和功能。这是一个强大的组合,可以帮助我们快速开发高效的Web应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值