Django学习之 - 基础视图函数
视图: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学习之 - 基础视图函数的更多相关文章
- django重点url,视图函数,模板语言
django重点url,视图函数,模板语言url 1.django重点url无命名分组:re_path() 2.url第一个参:url未命别名分组就不需要views中参数一定,若命别名(?P<y ...
- Django之views.py视图函数学习
视图函数: 视图函数时存在django项目中的应用程的一个名为views.py的文件模块: 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 一 ...
- Django学习 之后端视图与ajax
一.Ajax简介 在此之前你一定需要先学习下JavaScript JSON 可见: 前端学习 之 JavaScript 之 JSON 1.简单介绍 我们以前知道的前端向后端发送数据的方式有: GET: ...
- Django学习之 - 基础模板语言
模板语言if/else/endif {% if today_is_weekend %} <p>Welcome to the weekend!</p> {% else %} &l ...
- Django学习之 - 基础部分
学习记录参考: 讲师博客:http://www.cnblogs.com/wupeiqi/articles/5433893.html 老男孩博客:http://oldboy.blog.51cto.com ...
- Django学习日记06_视图_URLconf、View
URLconf Django通过URLconf来响应网页请求,在项目设置settings.py中,设定了ROOT_URLCONF值来指定默认的URLconf(即mysite.urls),当HTTPRe ...
- Django学习笔记之视图高级-CSV文件生成
生成CSV文件 有时候我们做的网站,需要将一些数据,生成有一个CSV文件给浏览器,并且是作为附件的形式下载下来.以下将讲解如何生成CSV文件. 生成小的CSV文件 这里将用一个生成小的CSV文件为例. ...
- Django学习笔记之视图高级-HTTP请求与响应
Django限制请求method 常用的请求method GET请求 GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改.比如向服务器获取某篇文章的详情. POST ...
- django系列3.3--view视图函数, render, reverse(未完待续)
1.view视图函数 urls分发之后所用到的处理函数 2.render 用于渲染页面 在views.py中常用 from django.shortcuts import render, HttpRe ...
随机推荐
- phpstorm中快速添加函数注释
Preferences 或 command+,快捷键 Live Templates - PHP 下方 - 新建模板 ,Abbreviation 命名随便写,点击Edit Variables配置变量信息 ...
- 移除sql数据所有链接用户
use master; go declare @temp nvarchar(20) declare myCurse cursor for select spid from sy ...
- 世平信息(T 面试)
1.跟我说下你们这个民主测评项目 在递归这一块扯了很久 2.遍历树结构,除了递归,还有什么方法? 3.如果数据库里面有2万条数据,你需要在前台用列表展示出来,有搜索功能.分页功能.总数:你觉得最需要优 ...
- 使用Spring AOP切面解决数据库读写分离
http://blog.jobbole.com/103496/ 为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如 ...
- merge dict key
#!/usr/local/python # -*- coding:utf-8 -*-user_dict = {'python': 23, 'Python': 51, '机器':10, 'PYTHON' ...
- day09 10 11 12 三天函数内容
小括号.中括号名字()函数调用符[] 索引调用符 函数的注释:官方推荐: 查看注释 :funcming.__doc__ funcming.__name__ def func(name, ag ...
- 什么是JavaScript框架-------share
摘要:现代网站和web应用程序趋向于依赖客户端的大量的javascript来提供丰富的交互.特别是通过不刷新页面的异步请求来返回数据或从服务器端的脚本(或数据系统)中得到响应.在这篇文章中,你将会了解 ...
- 洛谷 P2337 【[SCOI2012]喵星人的入侵】
这几天一直在刷插头Dp,写了几道入门题后,觉得还比较水,直到我发现了这一题.... 题目大意:给你一个n*m的地图,有些是空地,有些是障碍,还有两个是ST,在给你一个L,代表可以放L个炮台,你要在空地 ...
- 【HIHOCODER 1325】 平衡树·Treap
描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉排序树和堆啊,你看这两种数据结构都是构造了一个二叉树,一个节点有一个父亲和两个儿子. 如果 ...
- Dev Express中Dock panel的使用
使用DockManager,添加DockPanel. 1,DockManager位于“导航和布局”分类中. 添加一个DockManager控件到窗体中以后,即是在当前窗体类中,添加一个DockMana ...