视图: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. 伟景行 citymaker 从入门到精通(1)——js开发,最基本demo,加载cep工程文件

    开发环境:citymaker 7(以下简称cm),jquery,easyui 1.4(界面),visual studio 2012(没有vs,不部署到IIS也行,html文件在本地目录双击打开可用) ...

  2. Android基础夯实--重温动画(二)之Frame Animation

    心灵鸡汤:天下事有难易乎,为之,则难者亦易矣:不为,则易者亦难矣. 摘要 当你已经掌握了Tween Animation之后,再来看Frame Animation,你就会顿悟,喔,原来Frame Ani ...

  3. HDU 5410 CRB and His Birthday (01背包,完全背包,混合)

    题意:有n种商品,每种商品中有a个糖果,如果买这种商品就送多b个糖果,只有第一次买的时候才送.现在有m元,最多能买多少糖果? 思路:第一次买一种商品时有送糖果,对这一次进行一次01背包,也就是只能买一 ...

  4. Android系统固件定制方式

    target_product.mkAndroid系统在构建关于某种产品的固件时,一般会根据特定于该产品的具体target_product.mk来配置生成整个Android系统./target_prod ...

  5. iview 的 Carousel 走马灯 焦点图 不能用 建议换/vue-awesome-swiper

    https://www.npmjs.com/package/vue-awesome-swiper

  6. win手动编译JAVA 未完成(系统path未加入文章)

    java 下面存.BAT dir /s /B *.java > sources.txtjavac @sources.txt -bootclasspath "C:\Users\88797 ...

  7. git 添加外部项目地址

    github 提交第三方模块流程   // git config --global user.name 'your name' 可以设置全局用户名,在commit记录里显示的是这个配置设置的名称. / ...

  8. TCP socket编程记录(C语言)

    最近使用到TCP的socket编程,记录一下思路. TCP Socket 服务器编程思路 0.初始化套接字库 1.创建套接字----------2个(服务器本身需要一个套接字,客户端要返回一个套接字) ...

  9. 构造MaxTree

    链接:https://www.nowcoder.com/questionTerminal/a502c7c3c65e41fdaf65eec9e0654dcb 来源:牛客网 [编程题]构造MaxTree ...

  10. 3.3.3 使用 join 连接字段

        join 命令可以将多个文件结合在一起,每个文件里的每条记录,都共享一个键值(key),键值指的是记录中的主字段,通常会是用户名称.个人姓氏.员工编号之类的数据.举例来说,两个文件,一个列出所 ...