一:请求

  1. 浏览器向服务器传参的几种方式:

  方式一:通过正则的形式进行传递,名字为未命名模式

  路由的正则形式:

from django.conf.urls import url

from . import views  # 导入对应的视图函数名字,以后视图函数会越来越多。

urlpatterns = [
url(r"^index/", views.index),
url(r"^index_test/", views.index_test),
url(r"^attribute/([a-zA-Z]+)/(\d+)/",views.attribute) # 通过括号里面的正则,传递给视图函数,视图函数通过参数获取正则内容。
]

  视图函数的形式:

def attribute(request,name,age):
print("用户的名字是:{}".format(name))
print("用户的年龄是:{}".format(age))
return HttpResponse("接收到未命名的参数,按照顺序传递")

  访问127.0.0.1/user/attribute/zhang/15/ 结果是:

  总结:浏览器url --- apps的urlpattern中进行匹配---匹配合格后---传递给视图函数的形式参数。

  方式二:通过正则的形式进行传递,名字为命名模式,视图函数接收时候,可以按照顺序接收。

  路由的正则表达:

 url(r"^nature/(?P<school>[a-zA-Z]+)/(?P<major>[a-zA-Z]+)/", views.nature),

# 传递方式是先school/再major

  视图函数的形式:

def nature(request, major,school):
print("用户的专业是:{}".format(major))
print("用户的学校是:{}".format(school))
return HttpResponse("接收到命名的参数,可以不按照顺序传递") # 视图函数先接收major,再接收school,顺序和路由的传参顺序不一样。

  访问127.0.0.1/user/nature/qinghua/computer/ 结果是:

  2.query_dict 查询字典

  3.查询字符串

    127.0.0.1:8000/args?a=1&b=2&a=3/

# url规则
url(r"^args/", views.args) # 视图函数
def args(request):
a = request.GET.get("a") # 默认获取多值的最后一个
print("获取到查询字符串a的值是{}".format(a))
b = request.GET.get("b")
print("获取到查询字符串b的值是{}".format(b))
a_list = request.GET.getlist("a")
print("获取到查询多个字符串a的值是{}".format(a_list))
return HttpResponse("OK,获取到查询字符串")

    浏览器:

    控制台:

重要:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。

  4.从请求体中获取参数

django会自动对post,put,delete等请求进行拦截,防止跨域请求,因此在测试前,应注释掉setting.py中的设置

  5.从表单中获取数据  

  5.1.前端构造一个表单。

<!DOCTYPE html>
<html lang="zh-hans">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="POST"> # action=""表示还是向当前的url发送请求,请求方式为post
<input type="text" name="name" placeholder="姓名">
<input type="text" name="age" placeholder="年龄">
<button type="submit">提交表单数据</button>
</form>
</body>
</html>

  5.2 后端代码

url(r"^post_args", views.get_post_args),

def get_post_args(request):
if request.method == "GET":
    return render(request, "./get_post_args.html")
else:
name = request.POST.get("name") # 表单中的数据获取request.POST获取QueryDict对象。然后取对应键的值。
print(name)
age = request.POST.get("age")
print(age)
     return HttpResponse("表单提交的数据正常收到")

  5.3.浏览器访问  127.0.0.1:8000/user/post_args/

    提交表单数据前

    提交表单数据后:

   注释 setting.py中的MIDDLEWARE中的django.middleware.csrf.CsrfViewMiddleware',

  跨域请求方面的问题后面研究:

  6.获取非表单数据

  非表单数据,django无法直接解析,例如获取请求体里面的非表单数据,使用postman进行测试

  例如获取请求体中的json数据

def get_json_data(request):
json_str = request.body # json数据是通过requesy.body获得的,类型为byte
print(json_str) #b'{\n\n"test":"json_data"\n\n\n}'
json_str = json_str.decode("utf-8") # 将字节类型数据解析成字符串类型,进行json解析
data = json.loads(json_str) # 将json字符串转为python字典类型
print(data) # {'test': 'json_data'}
    d = data["test"]  # 从字典中取值。
print(d) # json_data
return HttpResponse("ok") postman中的情况


  请求头数据:request.META

def get_post_args(request):
if request.method == "GET":
return render(request, "./get_post_args.html")
else:
args = request.META
print(args)
name = request.POST.get("name")
age = request.POST.get("age")
return HttpResponse("表单提交的数据正常收到") # 看看post请求过来的函数,请求头的样子

  控制台输出的request.META的样子:字典

  获取常用字段的键

二:响应

1.HttpResponse响应对象

  视图在接收请求后,必须返回HttpResponse对象或者子对象,要不报错 renturn None。

  请求对象一般都是这样进行调用:from django.http import HttpResponse

HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)  

 2. JsonResponse响应对象

  专门给前端返回json的数据的响应对象,JsonResponse:帮我们将数据转换为json字符串,直接让前端进行使用

def index_test(request):
return JsonResponse({"name":"张学友","age":100})

django之请求和响应的更多相关文章

  1. django从请求到响应的过程深入讲解

    django启动 我们在启动一个django项目的时候,无论你是在命令行执行还是在pycharm直接点击运行,其实都是执行'runserver'的操作,而ruserver是使用django自带的的we ...

  2. 三、Django之请求与响应-Part 1

    一.新建项目 进入你指定的项目保存目录,然后运行下面的命令: $ django-admin startproject mysite 这将在目录下生成一个mysite目录,也就是你的这个Django项目 ...

  3. Django底层剖析之一次请求到响应的整个流程

    As we all know,所有的Web应用,其本质上其实就是一个socket服务端,而用户的浏览器就是一个socket客户端. #!/usr/bin/env python #coding:utf- ...

  4. Django - 请求与响应、表单、中间件、上下文处理器

    请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...

  5. 02_Django-路由配置-HTTP协议的请求和响应

    02_Django-路由配置-HTTP协议的请求和响应 视频:https://www.bilibili.com/video/BV1vK4y1o7jH 博客:https://blog.csdn.net/ ...

  6. Django编写RESTful API(二):请求和响应

    欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源.当然我 ...

  7. Django REST FrameWork中文教程2:请求和响应

    从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...

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

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

  9. django请求和响应

    本文转载自https://blog.csdn.net/xiaogeldx/article/details/88096341 HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建 ...

随机推荐

  1. 利用Javascript解决HTML大数据列表引起的网页加载慢/卡死问题。

    在一些网页应用中,有时会碰到一个超级巨大的列表,成千上万行,这时大部份浏览器解析起来就非常痛苦了(有可能直接卡死). 也许你们会说可以分页或动态加载啊?但是有可能需求不允许分页,动态加载?网络的延迟也 ...

  2. NOIP2012 洛谷P1083 借教室

    传送门 题意:有一些学(xian)生(quan)要借教室.在n天内,第i天学校有ri个教室.有m份订单,每份订单有三个数值dj,sj,tj,分别表示这个订单从第sj天开始到第tj天结束(包括端点),每 ...

  3. 通用 C# DLL 注入器injector(注入dll不限)

    为了方便那些不懂或者不想用C++的同志,我把C++的dll注入器源码转换成了C#的,这是一个很简单实用的注入器,用到了CreateRemoteThread,WriteProcessMemory ,Vi ...

  4. R 时间戳转化

    转 http://stackoverflow.com/questions/1962278/dealing-with-timestamps-in-r You want the (standard) PO ...

  5. Delphi XE2 之 FireMonkey 入门(10) - 常用结构 TPoint、TPointF、TSmallPoint、TSize、TRect、TRectF 及相关方法

    它们都是结构, TPointF.TRectF 属新增, 其它也都有升级; 现在都拥有丰富的方法和方便的运算符重载; 且有一组相关的公共函数. 这组内容重要的是它们都来自 System.Types 单元 ...

  6. Delphi XE2 之 FireMonkey 入门(7) - TText 与 TFont

    TText 也是从 TShape(TControl -> TShape)继承; 而与之类似的 TLabel 的继承序列是 TControl -> TStyledControl -> ...

  7. 40 insert语句的锁

    40 insert语句的锁 上一篇文章中对mysql自增主键锁做了优化,尽量在申请到自增id后,就释放自增锁. 因此,insert语句是一个很轻量的操作,不过,这个结论对于”普通的insert”才生效 ...

  8. Spring002--实现读写分离(Mysql实现主从复制)

    Spring AOP实现读写分离(Mysql实现主从复制) 本文来自于博客:http://www.cnblogs.com/bjlhx/p/8297460.html 一.背景 一般应用对数据库而言都是“ ...

  9. python基础-2 编码转换 pycharm 配置 运算符 基本数据类型int str list tupple dict for循环 enumerate序列方法 range和xrange

    1.编码转换 unicode 可以编译成 UTF-U GBK 即 #!/usr/bin/env python # -*- coding:utf-8 -*- a = '测试字符' #默认是utf-8 a ...

  10. [Python3] 015 冰冻集合的内置方法

    目录 0. 前言 英文名 元素要求 使用限制 返回 方法数量 1. 如何查看 frozenset() 的内置方法 2. 少废话,上例子 2.1 copy() 2.2 difference() 2.3 ...