Django基础(4)--视图简介

视图函数

Django提供了一整套应用框架,包括对于项目目录的建立,并且将所有的设置项整合在了settings.py文件中。

Django中开启一个新项目的操作流程

①创建新项目,django-admin startproject 项目名;
②创建应用,python manage.py startapp 应用名,创建模板目录,项目/templates/应用名/xxx.html;
③修改配置文件,注册应用,修改数据库配置,修改语言地区,修改模板目录,项目/项目名/settings.py;
④在项目名/init.py中添加链接数据库应用,使用mysql时,在项目名/init.py 下添加

import pymysql 
pymysql.install_as_MySQLdb()

⑤添加URL配置,从项目名/urls.py下

from django.urls import path, re_path, include
urlpatterns = [path('url', include('应用名.urls'))]

新建 应用名/urls.py

from django.urls import path, re_path 
from 项目名 import views
urlpatterns=[path('url', views.视图函数名)]

⑥添加模型类,应用名/models.py,其下所有模型类都继承自models.Model;
⑦添加视图函数,应用名/views.py

from django.shortcuts import render, HttpResponse, redirect, HttpResponseRedirect 
from 项目名 import 模型类名
from django.urls import reverse

其下所有视图函数都必须至少有一个request参数。

Django中URL相关

URL指定:首先注意输入的URL是当前URL的相对地址,若当前为127.0.0.1:8000/index,url为’create’,则指定URL为127.0.0.1:8000/index/create;url为’/create’,则指定URL为127.0.0.1:8000/create,前面有’/'则表示绝对路径,从根算起。

URL格式:①django中有默认设置APPEND_SLASH = True,意为对于任何不以’/‘结尾的URL会默认的重定向至有’/‘结尾的URL,因此在设置超链接/urls.py文件时,最好添加结尾的’/’,否则会进行重定向,多发请求。
②Django会在url中表示参数的符号’?'前添加默认的/;
总结来说,设置path匹配的URL与重定向/超链接的url在最后的/上匹配,否则会重定向甚至报错。

URL重定向:意为服务器不直接返回页面,而是让浏览器去请求其他的URL地址,进行了两次URL请求。

URL匹配:如请求的url为http://127.0.0.1:8000/index/args111?a=1&b=2,则在urls文件中进行匹配的部分为’index/args111/’,?后的为query对象,通过request.GET获取,注意Django2.x版本中建议使用path/re_path方法取代url方法,其过程:浏览器请求→项目urls→应用urls→views视图函数→templates模板→返回浏览器。

URL参数:url参数位于上述匹配部分中,即’args111’中的’111’可视为参数,其获取有两种方式①使用re_path对url进行正则匹配分组,组内的部分会自动的传入对应的视图函数(字符串),设置形参即可;②对分组进行命名,如(?P\d+),则对应的视图函数中参数名为id1。

设定debug模式与限制访问:在settings.py文件中将DEBUG = False,关闭调试模式(调试模式开启时错误信息不会显示在浏览器中,显示标准错误页面);ALLOWED_HOSTS = [’*’]意为允许所有IP访问,在关闭调试模式时必须设置此选项。

错误页面:在templates下自定义 错误代码.html(如404.html),当关闭调试模式出现错误时(打开时出错会显示错误信息),则django会自动的寻找templates下对应错误代码的页面并显示,如404.html(一般为url配置问题),500.html(一般为视图函数问题)。

关于URL设计的风格:RESTful(Representational State Transfer) API,是一种web应用的设计理念,其中包括URL设计/状态码设计/服务器回应等多个内容。
在URL设计中需要注意的一些点:①请求方法为动词,URL必须是一个指代资源的名词;②URL中的名词一般使用复数形式;③尽量避免过多级URL的存在;④URL指代请求的一种资源,在此之上的操作使用参数表示,如/list/种类id/页码?sort=排序方式。

通过请求向服务器提交参数
①URL参数,形如/index/upload/args/…,其中可以在匹配时设置分组或命名分组将位于URL中的参数获取,如可以设置re_path(r’/index/upload/(.*)’)获取到位置参数args;
②变量参数,形如/index/upload/args?a=1&b=2,使用GET方法直接写于URL后的参数,可以使用request.GET对象获取;
③POST参数,一般位于表单中,安全性较高,可以使用request.POST对象获取;
在设置URL时需要综合考虑安全性、易读性等方面。

views视图函数中返回对象的方法:如下表所示
在这里插入图片描述
在这里插入图片描述

在视图函数中用到的一些对象和属性

request对象
是WSGIRequest类型的对象,每一个视图函数都需要有一个request对象参数,django解析http请求报文并创建request对象保存参数,其属性有:

path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分(从域名到?之间的内容);
method:一个字符串,表示请求使用的HTTP方法,包括’GET’,‘POST’ 等;在浏览器中给出地址发出请求采用GET方式,如超链接,在地址栏直接输入URL;在浏览器中点击表单的提交按钮发起请求,如表单的method设置为post则为post请求;
encoding:一个字符串,表示提交的数据的编码方式;如果为None则表示使用浏览器的默认设置,一般为utf-8;这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值;
GET:QueryDict类型对象,类似于字典,包含get请求方式的所有参数,request.GET[‘a’]/.get(‘a’);(通过GET提交的参数位于URL中,安全性不高);
POST:QueryDict类型对象,类似于字典,包含post请求方式的所有参数;(通过POST提交的参数位于请求头中,安全性较高);
FILES:一个类似于字典的对象,包含所有的上传文件;
COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串;
session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用。

QueryDict类型对象:其类似于字典,在GET/POST方法中,其传入参数的类型都为’a=1&b=2’,即以&隔开的键值对形式,其会将键值对拆分为两个字符串并组成对应关系,①添加,q=QueryDict(‘a=1&c=3&a=2’),在GET方法中截取URL中?后的部分,在POST方法中以form的name属性的值为键(开发人员设定),value属性的值为值(用户填写);②查询,其支持一个键对应多个值,q.get(‘a’, default)查询’a’的值若不存在则返回default,q.getlist(‘a’)与上类似但返回一个’a’的值组成的列表(一般用于循环的表单/无序列表中,name属性相同value值不同),q[‘a’]当’a’不存在时报错。

JsonResponse对象:其是HttpResponse的子类,用于ajax请求返回json类型的数据,ajax即异步的JavaScript方法(详见前端学习)。在使用之前,需要在项目下新建static文件夹,并在settings中设置静态文件的保存目录,一般在静态文件夹下设置js,css,img目录保存要使用的静态文件。(可用于实现页面的局部刷新,即不重新加载页面的所有内容)
ajax请求都在后台,需返回JsonResponse对象,不能直接使用render/redirect,其页面不会变化(请求在后台访问,其会访问指定的页面,但不显现)。

request与response对象:在views函数中,第一个参数request是包含有浏览器请求信息的WSGIRequest类型的请求对象,而如果要设置cookie,则需要在服务器发送回去的HttpResponse(包括JsonResponse,HttpResponseRedirect,redirect,render等)对象中设置。

cookie与session

cookie:指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密),其最典型的例子为记住用户名,cookie的特点:
①由服务器生成,以键值对的方式存储在浏览器中(服务器生成后保存在HttpResponse对象中发送给浏览器)
②访问一个网站时,会将浏览器存储的所有与该服务器相关的cookie全部发送(保存在WSGIrequest对象.COOKIES中,是一个标准的python字典格式)
③cookie基于域名安全,即不同IP的cookie是不能相互访问的
④cookie是有过期时间的,若不设置,则默认浏览器关闭即过期(在set_cookie方法中可指定关键字参数,max_age=100单位为秒,expires指定具体过期的时间)
⑤cookie无论保存的是何种格式的数据,取出时都为字符串格式(注意redirect后是URL,而render中是关联的模板路径)

Django中cookie的应用
①在服务器端设置cookie并发送给浏览器,HttpResponse对象.set_cookie(‘key’, value, max_age);
②浏览器访问服务器并将cookie包在请求头中发送给服务器,在服务器端使用WSGIrequest对象.COOKIES(一个标准的python字典)访问;
③对request中包含的cookies进行判断,确定用户的信息等。(也可用于登录状态验证,但相对不安全)

session:指服务器为每个浏览器保存数据的机制(一般用于保存比较重要,敏感的信息)session的特点:
①由服务器生成,以键值对的方式保存在服务器中;
②session依赖于cookie(其唯一标识的session_key是使用cookie来保存的,称为sessionid);
③session指定的过期时间是cookie sessionID的过期时间。

Django中session的应用
①浏览器访问服务器,服务器处理信息并生成session(保存在数据库中,表格三个字段session_key, session_data, expire_date,将session_key作为唯一标识该session的对象发送给浏览器,名为sessionid,此为Django生成) request.session[‘name’]=‘tom’;
②浏览器再访问时直接根据sessionid取出对应的session信息(取出的具体过程被Django封装,获取sessionid→访问数据库→获取对应session key的值),request.session[‘name’];
③删除del request.session[‘x’]删除单个键值对信息,获取request.session[‘x’]/ request.session.get(‘x’, default),清空request.session.clear(),清除session request.session.flush(),设置超时时间request.session.set_expiry(value)其中value为整数时代表秒数,为0时表示浏览器关闭即过期,为None时表示永不过期,默认14days。

session与cookie的联系与区别
①session保存于服务器端,cookie保存于浏览器端并每次访问都携带;
②session依赖于cookie工作,其唯一标识的sessionid存在于cookie中;
③session用于保存重要的信息,cookie安全性不高;
④cookie中提出的值全为字符串格式,session中不改变其存储的格式;
cookie的使用方式为response设置request携带,session的使用方式为request设置并在其他视图函数中request使用,但request其实只携带了sessionid,内容在服务器端,其依赖request中携带的sessionid来标识不同的浏览器。

注意:①sessionID过期意为浏览器中的cookie过期,服务器中的session信息仍然保存在表中(设置的expire也作为一个键值对保存于session_data中);
②session_data以base64的编码方式保存于数据库中,不明文保存;
③对一个浏览器可以重复设置多个session,但浏览器对相同的服务器只会保存最新的sessionid;
④session常用于保持登录状态,在登录成功时设置session,在后续需要校检登录状态时设置request.session.haskey(‘islogin’)若存在则跳过登录,一般将此功能封装为装饰器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值