2、GET请求能够被cache,GET请求能够被保存在浏览器的浏览历史里面(密码等重要数据GET提交,别人查看历史记录,就可以直接看到这些私密数据)POST不进行缓存。

3、GET参数是带在URL后面,传统IE中URL的最大可用长度为2048字符,其他浏览器对URL长度限制实现上有所不同。POST请求无长度限制(目前理论上是这样的)。

4、GET提交的数据大小,不同浏览器的限制不同,一般在2k-8K之间,POST提交数据比较大,大小靠服务器的设定值限制,而且某些数据只能用 POST 方法「携带」,比如 file。

5、全部用POST不是十分合理,最好先把请求按功能和场景分下类,对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的2k范围内,这样的情况使用GET。其他地方使用POST。

6、GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「幂等」的,在这一点上,GET 被认为是「安全的」。但实际上 server 端也可以用作资源更新,但是这种用法违反了约定,容易造成 CSRF(跨站请求伪造)。

REF:

maximum length of HTTP GET request?

http://stackoverflow.com/questions/2659952/maximum-length-of-http-get-request  

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.15 Request-URI Too Long

http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.1 General Syntax

http://www.cnblogs.com/xiaotaomaomao/articles/986070.html

http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html HTTP协议详解

post方式相比get安全,携带数据更大,我准备所有数据都用post方式获取,这样好吗?

http://segmentfault.com/q/1010000000213082  

http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html   浅谈CSRF攻击方式

  

Post 与GET请求的对比.解释.

https://my.oschina.net/leejun2005/blog/136820

在IE8 下的URL地址总长度为:4076,超过该长度会自动忽略后面的内容;

在firefox 25下的URL地址总长度可以达到:7530,超过该长度会访问错误;

在chrome 29.0.1547.62 的最大总长度达到:7675,超过该长度会访问错误;

https://www.jianshu.com/p/512389822f8b   关于 post 与get请求参数长度限制的问题,(其实get与post都没有长度限制.)

https://blog.csdn.net/xnf1991/article/details/52157378   post 与GET的区别

ORM(object rational mapping )

对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的--"虚拟对象数据库"。

增删改查

1.  查

暂时注释掉 csrf, 在mysite->settings.py配置文件中

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

settings里的templates文件不动

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.

在setting里设置app配置文件 (不需要)

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',

在 app01->apps.py中设置,(不需要设置)

from django.apps import AppConfig

class App01Config(AppConfig):
name = 'app01'

设置静态文件的路径 并新建一个static文件夹存放 静态文件.

STATIC_URL = '/static/'
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static')
]

设置路径的对应关系,在mysite的urls.py 文件中进行设置.

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Publisher_list',views.Publisher_list)

将bootstrap、jquery 库放到static目录下

在 app01->modules里设置:

from django.db import models

# Create your models here.
#图书管理系统,书,作者,出版社 #出版社
class Publisher(models.Model):
id = models.AutoField(primary_key=True) #自增的ID主键
#创建一个varchar(64)的唯一的不为空的字段
name= models.CharField(max_length=64,null=False,unique=True)

设置数据库文件在settings文件夹下

DATABASES = {
'default':{
#连接数据库类型
'ENGINE':'django.db.backends.mysql',
#连接数据库地址
'HOST':'127.0.0.1',
#数据库名称
'NAME':'day62',
#用户
'USER':'root',
#密码
'PASSWORD':'123456'
}
}

  

设置对应的函数.

from django.shortcuts import render,HttpResponse,redirect
from app01 import models
# Create your views here.
#展示出版社列表
def Publisher_list(request):
# 去数据库查出所有的出版社,填充到htnml中,给用户返回
ret =models.Publisher.objects.all().order_by('id')
return render(request,'publisher_list.html',{'publisher_list':ret})

  

publisher_list html文件新建一个放在template里

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>publisher_list</title>
</head>
<body>
<table>
<thead>
<tr>
<th>ID</th>
<th>序号</th>
<th>书名</th>
</tr>
</thead> <tbody>
{% for publisher in publisher_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ publisher.id }}</td>
<td>{{ publisher.name }}</td>

<td>
  <a href="/delete_publisher/?id={{ publisher.id }}">删除</a>
  <a href="/edit_publisher/?id={{ publisher.id }}">编辑</a>
</td>
</tr>

{% endfor %}
</tbody>
</table>
</body>
</html>

查看页面

 二、增

在url里添加路径对应关系

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Publisher_list/',views.Publisher_list),
url(r'^Publisher_add/',views.Publisher_add)

在views里添加代码

def Publisher_add(request):
# error_msg =''
#如果是POST请求,我就会取到用户填写的数据
if request.method =='POST':
new_name =request.POST.get('publisher_name',None)
if new_name:
#通过ORM去数据库里新建一条记录
models.Publisher.objects.create(name=new_name)
#引导用户访问出版社列表页,查看是否添加成功-->
return redirect('/Publisher_list/')
# else: error_msg ='出版社名字不能为空'
return render(request,'publisher_add.html')

  

定义静态网页 publisher_add.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>publisher_add</title>
</head>
<body>
<h1>添加出版社</h1>
<form action="/Publisher_add/"method="post">
<input type="text" name=" publisher_name">
<input type="submit"value="提交">
<p style="color: red">{{ error }}</p>
</form>
</body>
</html>

  

访问页面

查看到的日志信息

Not Found: /favicon.ico
[03/May/2018 14:57:04] "GET /favicon.ico HTTP/1.1" 404 2193
[03/May/2018 14:57:05] "GET /Publisher_add/ HTTP/1.1" 200 327
[03/May/2018 14:57:17] "POST /Publisher_add/ HTTP/1.1" 302 0
[03/May/2018 14:57:17] "GET /Publisher_list/ HTTP/1.1" 200 1080

  

三、删除

① 在urls里添加如下代码,如红色表示:

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Publisher_list/',views.Publisher_list),
url(r'^Publisher_add/',views.Publisher_add),
url(r'^Publisher_del/',views.Publisher_del),

  

② 更改 publisher_list html页面 如红色表示的

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>publisher_list</title>
</head>
<body>
<table border="2">
<thead>
<tr>
<th>ID</th>
<th>序号</th>
<th>书名</th>
<th>操作</th>
</tr>
</thead> <tbody>
{% for publisher in publisher_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ publisher.id }}</td>
<td>{{ publisher.name }}</td>
<td>
<a href="/Publisher_del/?id={{ publisher.id }}">删除</a> # Publisher_del 为url 的路径,不能写错
<a href="/Publisher_del/?id={{ publisher.name }}">编辑</a>  
# Publisher_del 为url 的路径,不能写错
 </td> </tr> {% endfor %} 
</tbody>
</table>
</body>
</html>

  

③ 编辑 publisher_del 函数

def Publisher_del(request):
print(request.GET)
print('='*)
#删除指定的数据
#.从 GET请求的参数里面拿到将要删除的数据的id值
del_id = request.GET.get('id',None)#字典取值,取不到默认为None GET 请求获取数据
#如果能取到id值
if del_id:
#去数据库删除当前id值的数据
#根据id值查找到数据
del_obj = models.Publisher.objects.get(id=del_id) 通过orm查找数据库字段
print(del_obj)
#删除数据
del_obj.delete()
#返回删除后的页面,跳转到出版社的列表页,查看删除是否成功
return redirect('/Publisher_list/')
else:
return HttpResponse('要删除的数据不存在')

打印出来的结果:

[/May/ ::] "GET /favicon.ico HTTP/1.1"
[/May/ ::] "GET /Publisher_list/ HTTP/1.1"
<QueryDict: {'id': ['']}>
========================================================================================================================
Publisher object
[/May/ ::] "GET /Publisher_del/?id=4 HTTP/1.1"
[/May/ ::] "GET /Publisher_list/ HTTP/1.1"

页面的样式:

四、编辑

修正下html文件

更改urls文件

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Publisher_list/',views.Publisher_list),
url(r'^Publisher_add/',views.Publisher_add),
url(r'^Publisher_del/',views.Publisher_del),
url(r'^Publisher_edit/',views.Publisher_edit)

  

views文件

def Publisher_edit(request):
# 用户修改完出版社的名字,点击提交按钮,给我发来新的出版社名字
print(request.method)
if request.method == 'POST':
print(request.POST)# 结果为GET
# 获取新的出版社名字
edit_id = request.POST.get('id')
new_name = request.POST.get('publisher_name')
# 更新出版社
# 根据id取到编辑的是哪个出版社
edit_publisher = models.Publisher.objects.get(id=edit_id)
edit_publisher.name = new_name
edit_publisher.save() # 把修改同步提交到数据库。
return redirect('/Publisher_list/')
# 跳转到出版社列表页,查看是否修改成功.
  else:
    # 从GET请求的URL中取到ID参数
     edit_id = request.GET.get('id', None)
     print(edit_id) #结果为 11
    
if edit_id:
     # 获取到当前编辑的出版社对象;
     publisher_obj = models.Publisher.objects.get(id=edit_id)
     print(publisher_obj) #结果为 11,dfdaf
    
return render(request, 'publisher_edit.html', {'publisher': publisher_obj})
     else:
   return HttpResponse('编辑的出版社不存在')

静态html文件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>publisher_edit</title>
</head>
<body>
<h1>编辑出版社</h1> <form action="/Publisher_edit/" method ='post'>
<input type="text" name = 'id' value="{{ publisher.id }}"style="display: none">
<input type="text" name="publisher_name" value="{{ publisher.name }}">
<input type="submit" value="提交">
<p style="color: red">{{ error }}</p>
</form>
</body>
</html>

执行点击编辑按键

打印结果

GET
11
11,dfdfda
[03/May/2018 21:10:13] "GET /Publisher_edit/?id=11 HTTP/1.1" 200 414

Day 62 Django第三天的更多相关文章

  1. django笔记三之admin的管理

    django笔记三之admin的管理 设置自动admin应用 vim todos/settings.py INSTALLED_APPS = ( 'django.contrib.admin', 新版本已 ...

  2. Django - Xadmin (三) 分页、搜索和批量操作

    Django - Xadmin (三) 分页.搜索和批量操作 分页和 ShowList 类 因为 list_view 视图函数里面代码太多,太乱,所以将其里面的用于处理表头.处理表单数据的关键代码提取 ...

  3. day 53-1 Django基础三之视图函数

    Django基础三之视图函数   本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Dja ...

  4. day 67 Django基础三之视图函数

    Django基础三之视图函数   本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Dja ...

  5. Django基础三之路由、视图、模板

    Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...

  6. python 学习第二十一天,django知识(三)

    一,django的url路由系统总结 1,url(/index/,函数或者类) 2,url(/index/(\d+), 函数或者类) 3,url(/index/(?P<nid>\d+),函 ...

  7. Django(三)

    1.Django请求的生命周期         路由系统 -> 视图函数(获取模板+数据-->渲染) -> 字符串返回给用户   2.路由系统         /index/    ...

  8. Django(三) ORM 数据库操作

    大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...

  9. DJango 前三天小结

    一 DJango 所有命令: 1下载: 控制台:pip install django== ​pip install django== -i 源解释器:找到解释器,点击加号搜索django 2创建项目; ...

随机推荐

  1. OpenStack概念架构简述

    什么是OpenStack OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云 ...

  2. tp中引入js、css、img的问题

    方法一: 直接把js.css.img放到网站公共目录/Public/下. 然后直接在模板文件中使用__PUBLIC__进行替换. 方法二: 在模块配置文件config.php中配置指定的路径,如下: ...

  3. JAVA规则引擎JSR-94笔札

    JAVA规则引擎JSR-94笔札 JSR-94 是由JCP(Java Community Process)组织所制定的java规则引擎API的java请求规范.它主要定义了规则引擎在java运行时的一 ...

  4. 有符号无符号bit转换

    int main(){ unsigned short i = 65434; short p = i; printf("%d", p); int sp; scanf_s(" ...

  5. wcf数据推送

    http://www.cnblogs.com/artech/archive/2007/03/02/661969.html

  6. Axios的基本使用

    Axios的基本使用 介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.在vue 中,用来发ajax请求,与后端交互. 从浏览器中创建 XMLHtt ...

  7. UVa 11732 "strcmp()" Anyone? (左儿子右兄弟前缀树Trie)

    题意:给定strcmp函数,输入n个字符串,让你用给定的strcmp函数判断字符比较了多少次. 析:题意不理解的可以阅读原题https://uva.onlinejudge.org/index.php? ...

  8. 20155218 2016-2017-2 《Java程序设计》第6周学习总结

    20155218 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象. dump()方 ...

  9. struts2从浅至深(四)下载文件

    1.创建下载文件动作类 2.配置struts 3.提供一个下载链接 4.下载页面 为什么文件名是链接名 只是以链接名显示,但文件的本身是个图片秩序改掉后缀名就可以了

  10. Oracle实现递归查询

    前几天在开发的过程中遇到一个递归查询的问题,java代码大致是这样的: // 递归得到四级机构对象 public UserManagerDept getuserManagerDeptBy(String ...