视图:Views

获取用户请求的方法:
1: request.GET
2: request.POST
3: request.FILES
# checkbox 等多选文件
4:request.POST.getlist()
# 上传文件,form标签要做特殊设置
  obj = request.FILES.get('fafafa')
  obj.name 上传的文件名
  obj.chunks() 上传的文件内容
  f = open(obj.name,mode='wb')
  for item in obj.chunks():
    f.write(item)
  f.close()
实例:注册register视图函数

 def register(request):
if request.method == 'GET':
return render(request,'register.html')
elif request.method == 'POST':
uname = request.POST.get('username',None)
upwd = request.POST.get('pwd',None)
print('用户名:',uname,'密码:',upwd)
ugender = request.POST.get('gender',None)
print('性别:', ugender)
ufavor = request.POST.getlist('favor',None)
print('爱好:',ufavor)
ucity = request.POST.getlist('city',None)
print('城市:',ucity)
obj = request.FILES.get('upfile')
tmppath = os.path.join('upload',obj.name)
f = open(tmppath,mode='wb')
for item in obj.chunks():
f.write(item)
return HttpResponse('注册完毕')
else:
return redirect('/register')

5:request.method
6:request.path_info
7:request.COOKIES
request.body # 所有提交的数据的原生值
  - request.POST
  - request.GET
  - request.FILES
  - request.xxx.getlist
request.Meta # 获取提交的数据的请求头信息,如客户端游览器这里可以提取到
  - request.method(POST,GET,PUT)
  - request.path_info
  - request.COOKIES
返回3种:
  return HttpResponse('字符串或者字节')
  return render()
  return redirect()
返回cookie,并且可以自定义添加响应头返回给客户端,客户端游览器可以在响应头查看到返回的值
  response = HttpResponse('china')
  response['name'] = jack
  response.set_cookie()
  return response

FBV & CBV
FBV ( function base view) :就是在视图里使用函数处理请求。
/index ==> 函数
CBV ( class base view) :就是在视图里使用类处理请求
/index ==> 类
实例cbv写法:

 urls写法:
url(r'^cbv',views.cbv.as_view()), 视图函数:
class cbv(View):
def dispath(self,request,*args,**kwargs):
# 调用父类中的dispath
print('before')
result = super(cbv,self).dispatch(request,*args,**kwargs)
print('after')
return result
def get(self,request):
print(request.method)
return render(request,'CBV.html')
def post(self,request):
print(request.method,'POST')
return render(request,'CBV.html')

CBV

建议:俩者都用
CBV / FBV 装饰器
FBV 装饰器:
  def auth(func):
    def inner(request,*args,**kwargs):
      v = request.COOKIES.get('uname')
      if not v:
        return redirect('/ug/login')
      return func(*args,**kwargs)
    return inner
CBV 装饰器:
  from django import views
  from django.utils.decorators import method_decorator
  class Order(views.View):
    @method_decorator(auth)
    def get(self,request):
      v = request.COOKIES.get('uname')
      return render(request,'index.html',{'current_user':v})
    def post(self,request):
      v = request.COOKIES.get('uname')
      return render(request,'index.html',{'current_user':v})

- 获取请求的其他信息
通过pring(type(request))获取模块文件名
from django.core.handlers.wsgi import WSGIRequest
request.environ # 输出请求的所有信息
request.environ['HTTP_USER_AGENT'] # 获取http_user_agent数据
通过以上方法提取环境数据
- 分页(自定义)
XSS:
前台:{{ page_str|safe }}
后台:mark_safe(page_str)
分页实例:

html页面

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分页</title>
<style>
.page {
background:#9acfea;
padding: 5px;
margin:5px;
}
.active{
background:red;
}
</style>
</head>
<body>
<ul>
{% for i in li %}
{% include 'li.html' %}
{% endfor %}
</ul>
{# {{ page_str|safe }}#}
<div style="float: left;">
<select id='ps' onchange="changePageSize(this);">
<option value="10">10</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
</div>
<div style="float: left;">
{{ page_str }}
</div>
<script src="/static/jquery-1.12.4.min.js"></script>
<script src="/static/jquery-cookie/jquery.cookie.js"></script>
<script>
/*select选项框修改为当前显示数量*/
$(function () {
var v = $.cookie('per_page_count',{'path':"/ug/userlist"});
$('#ps').val(v)
});
/*select选项框选择后自动刷新页面*/
function changePageSize(ths) {
var v = $(ths).val();
$.cookie('per_page_count',v,{'path':"/ug/userlist"});
location.reload();
}
</script>
</body>
</html>

视图函数

 from utils import pagination
ulist = []
for i in range(1009):
ulist.append(i)
def userlist(request):
current_page = request.GET.get('p',1)
current_page = int(current_page)
val = request.COOKIES.get('per_page_count',10)
page_obj = pagination.Page(current_page,len(ulist),int(val))
data = ulist[page_obj.start:page_obj.end]
page_str = page_obj.page_str('/ug/userlist/')
return render(request,'userlist.html',{'li':data,'page_str':page_str})

后台模块:pagination

 #!/bin/env python
#Author: zhaoyong
from django.utils.safestring import mark_safe
class Page:
'''
实现分页显示功能类
'''
def __init__(self,current_page,data_count,per_page_count = 10,pager_num=7):
'''
用于分页模块
:param current_page: 当前页
:param data_count: 数据总个数
;:param per_page_count: 每页显示数据数量
;:param pager_num: 每页的页码总数
'''
self.current_page = current_page
self.data_count = data_count
self.per_page_count = per_page_count
self.pager_num = pager_num
@property
def start(self):
''' 列表切片起始索引位置'''
return (self.current_page - 1) * self.per_page_count
@property
def end(self):
''' 列表切片结束索引位置'''
return self.current_page * self.per_page_count
@property
def all_count(self):
'''生成页码的总数'''
v, y = divmod(self.data_count, self.per_page_count)
if y:
v += 1
return v
def page_str(self,base_url):
''' 实现具体的分页显示'''
page_list = []
if self.all_count < self.pager_num:
start_page = 1
end_page = self.all_count + 1
else:
if self.current_page < (self.pager_num + 1) / 2:
start_page = 1
end_page = self.pager_num + 1
else:
start_page = self.current_page - (self.pager_num - 1) / 2
end_page = self.current_page + (self.pager_num + 1) / 2
if self.current_page + (self.pager_num - 1) / 2 > self.all_count:
start_page = self.all_count - self.pager_num + 1
end_page = self.all_count + 1 if self.current_page <= 1:
prv = '<a class="page" href="javascript:void(0);">上一页</a>'
else:
prv = '<a class="page" href=%s?p=%s>上一页</a>' % (base_url,self.current_page - 1)
page_list.append(prv)
for i in range(int(start_page), int(end_page)):
if i == self.current_page:
temp = '<a class="page active" href=%s?p=%s>%s</a>' % (base_url,i, i)
else:
temp = '<a class="page" href=%s?p=%s>%s</a>' % (base_url,i, i)
page_list.append(temp)
if self.current_page == self.all_count:
next = '<a class="page" href="javascript:void(0);">下一页</a>'
else:
next = '<a class="page" href=%s?p=%s>下一页</a>' % (base_url,self.current_page + 1)
page_list.append(next)
jump = '''
<input type='text' /><a onclick="jumpto(this,'%s?p=');">GO</a>
<script>
function jumpto(ths,base){
var val = ths.previousSibling.value;
if(val.length != 0){
location.href = base + val;
}
}
</script>
''' % (base_url)
page_list.append(jump)
page_str = mark_safe(''.join(page_list))
return page_str

Django学习之 - 基础视图函数的更多相关文章

  1. django重点url,视图函数,模板语言

    django重点url,视图函数,模板语言url 1.django重点url无命名分组:re_path() 2.url第一个参:url未命别名分组就不需要views中参数一定,若命别名(?P<y ...

  2. Django之views.py视图函数学习

    视图函数: 视图函数时存在django项目中的应用程的一个名为views.py的文件模块: 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 一 ...

  3. Django学习 之后端视图与ajax

    一.Ajax简介 在此之前你一定需要先学习下JavaScript JSON 可见: 前端学习 之 JavaScript 之 JSON 1.简单介绍 我们以前知道的前端向后端发送数据的方式有: GET: ...

  4. Django学习之 - 基础模板语言

    模板语言if/else/endif {% if today_is_weekend %} <p>Welcome to the weekend!</p> {% else %} &l ...

  5. Django学习之 - 基础部分

    学习记录参考: 讲师博客:http://www.cnblogs.com/wupeiqi/articles/5433893.html 老男孩博客:http://oldboy.blog.51cto.com ...

  6. Django学习日记06_视图_URLconf、View

    URLconf Django通过URLconf来响应网页请求,在项目设置settings.py中,设定了ROOT_URLCONF值来指定默认的URLconf(即mysite.urls),当HTTPRe ...

  7. Django学习笔记之视图高级-CSV文件生成

    生成CSV文件 有时候我们做的网站,需要将一些数据,生成有一个CSV文件给浏览器,并且是作为附件的形式下载下来.以下将讲解如何生成CSV文件. 生成小的CSV文件 这里将用一个生成小的CSV文件为例. ...

  8. Django学习笔记之视图高级-HTTP请求与响应

    Django限制请求method 常用的请求method GET请求 GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改.比如向服务器获取某篇文章的详情. POST ...

  9. django系列3.3--view视图函数, render, reverse(未完待续)

    1.view视图函数 urls分发之后所用到的处理函数 2.render 用于渲染页面 在views.py中常用 from django.shortcuts import render, HttpRe ...

随机推荐

  1. iOS 二维码扫描 通过ZBar ZXing等第三方库

    扫描二维码的开源库有很多如 ZBar.ZXing等 ZBar的使用方法: 下载ZBar SDK 地址https://github.com/bmorton/ZBarSDK ZBarSDK是一个开源的SD ...

  2. Java集合类工具CollectionUtils的操作方法

    集合判断: 例1: 判断集合是否为空:CollectionUtils.isEmpty(null): trueCollectionUtils.isEmpty(new ArrayList()): true ...

  3. python基础一 day9 函数升阶(2)

    def max(a,b): return a if a>b else bprint(max(1, 2)) # 函数进阶# a = 1# def func():# print(a)# func() ...

  4. Wow64

    翻译自Wikipedia: WoW64 运行在微软平台上,WoW64(Windows 32-bit on Windows 64-bit) 是一个Windows的子操作系统, 它能运行32位的应用,在所 ...

  5. python之str (字符型)

    用途: 存储少量的数据,+ *int 切片, 其他操作方法 切片还是对其进行任何操作,获取的内容全部是strl类型 存储数据单一 格式: 在python中用引号引起来的就是字符串 '今天吃了没?' 1 ...

  6. sqlserver 分页问题

    1.top 主要是在sql server 2000中使用,效率较差 2.row_number函数 这种方法是sql server 2005以后,支持了row_number函数后,才开始使用的. dec ...

  7. mybatis-使用junit测试与main方法测试结果不一致问题

    今天使用ieda写mybatis程序感觉太不友好了,而且也没找到问题所在.问题:写的user.xml中的语句与输出的语句不一样.尝试了各种办法都没有解决. mybatis配置的使用的查询实体.xml ...

  8. 拖拽功能-jquery

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. codevs 2853 方格游戏--棋盘dp

    方格游戏:http://codevs.cn/problem/2853/ 这和传纸条和noip方格取数这两个题有一定的相似性,当第一眼看到的时候我们就会想到设计$dp[i][j][k][l]$(i,j表 ...

  10. CentOS7安装Tomcat9并配置

    划重点:安装tomcat之前必须先安装jdk  安装教程 1.下载 Tomcat 9 CentOS 7 下创建目录并下载文件:// 链接已更新 cd /usr/local/ mkdir tomcat ...