Django入门到放弃之view

简介: Django入门到放弃之view

一、视图层之请求对象(request)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

def index(request):

    '''

    request:django封装的对象,它的类是WSGIRequest,它里面包含了所有http请求的东西

    '''

    print(request)

    print(type(request))

    # from django.core.handlers.wsgi import WSGIRequest

    #######################1 看前博客

    print(request.method)

   

    

    '''

    使用form表单,默认情况下数据被转成name=lqz&password=123放到请求体中,如果不是则需要到body中获取

    request.POST其实是从body中取出bytes格式的,转成了字典

    requet.GET其实是把路径中?后面的部分拆出来,转成了字典

    '''

    print(request.GET) #get传参 字典

    print(request.POST) #post提交的数据

    print(request.body)      # 请求体,二进制,如果传文件,这个报错

 

    

    ########################2 path里的,get_full_path,META,FIELS,body

    # 自定制请求头

    # 上传文件使用的编码方式是form-data,默认编码方式urlencoded

    print(request.is_ajax()) # 是不是ajax请求

    print(request.path)      # 请求路径

    print(request.get_full_path()) # 请求全路径,带数据

 

 

    print(request.encoding) # 客户端向服务端传递时,使用的编码方法

 

    print(request.META)    # 重点,字典,一堆东西,请求用户的ip地址,请求头中数据,用户自定制请求头的数据

    '''

    把请求头的key值部分统一加HTTP_  并且全部转成大写

    '''

    print(request.META['REMOTE_ADDR'])  # 客户端的ip地址

    print(request.FILES)  # 客户端上传的文件

 

 

 

    ########################

    print(request.COOKIES) # 空字典

    print(request.session) # session对象

    print(request.user)    # 匿名用户

    return HttpResponse('ok')

request属性

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

1.HttpRequest.GET

  一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。

 

2.HttpRequest.POST

  一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。

  POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。

   因此,不应该使用 if request.POST  来检查使用的是否是POST 方法;应该使用 if request.method == "POST"

  另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。

   注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:

        request.POST.getlist("hobby")

 

3.HttpRequest.body

  一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json

  但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。

 

 

4.HttpRequest.path

  一个字符串,表示请求的路径组件(不含域名)。

  例如:"/music/bands/the_beatles/"

 

5.HttpRequest.method

  一个字符串,表示请求使用的HTTP 方法。必须使用大写。

  例如:"GET""POST"

 

 

6.HttpRequest.encoding

  一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。

   这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。

   接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。

   如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。

 

 

7.HttpRequest.META

   一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:

  取值:

    CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。

    CONTENT_TYPE —— 请求的正文的MIME 类型。

    HTTP_ACCEPT —— 响应可接收的Content-Type

    HTTP_ACCEPT_ENCODING —— 响应可接收的编码。

    HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。

    HTTP_HOST —— 客服端发送的HTTP Host 头部。

    HTTP_REFERER —— Referring 页面。

    HTTP_USER_AGENT —— 客户端的user-agent 字符串。

    QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。

    REMOTE_ADDR —— 客户端的IP 地址。

    REMOTE_HOST —— 客户端的主机名。

    REMOTE_USER —— 服务器认证后的用户。

    REQUEST_METHOD —— 一个字符串,例如"GET" "POST"

    SERVER_NAME —— 服务器的主机名。

    SERVER_PORT —— 服务器的端口(是一个字符串)。

   从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,

    都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_  前缀。

    所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。

 

8.HttpRequest.FILES

  一个类似于字典的对象,包含所有的上传文件信息。

   FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。

  注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会

   包含数据。否则,FILES 将为一个空的类似于字典的对象。

 

 

9.HttpRequest.COOKIES

  一个标准的Python 字典,包含所有的cookie。键和值都为字符串。

 

 

 

10.HttpRequest.session

   一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。

    完整的细节参见会话的文档。

 

11.HttpRequest.user(用户认证组件下使用)

  一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。

  如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。

 

    例如:

    if request.user.is_authenticated():

        # Do something for logged-in users.

    else:

        # Do something for anonymous users.

       user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。

 

     -------------------------------------------------------------------------------------

 

    匿名用户

    class models.AnonymousUser

    django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User 接口,但具有下面几个不同点:

 

    id 永远为None

    username 永远为空字符串。

    get_username() 永远返回空字符串。

    is_staff 和 is_superuser 永远为False

    is_active 永远为 False

    groups 和 user_permissions 永远为空。

    is_anonymous() 返回True 而不是False

    is_authenticated() 返回False 而不是True

    set_password()、check_password()、save() 和delete() 引发 NotImplementedError。

    New in Django 1.8:

    新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。

request常用方法

1

2

3

4

5

6

7

8

9

10

1.HttpRequest.get_full_path()

  返回 path,如果可以将加上查询字符串。

  例如:"/music/bands/the_beatles/?print=true"

  注意和path的区别:http://127.0.0.1:8001/order/?name=lqz&age=10

 

2.HttpRequest.is_ajax()

  如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串'XMLHttpRequest'

  大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。

  如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django 的 cache middleware,

   你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应能够正确地缓存。

二、视图层之响应对象

1.响应对象四种形式

1

2

3

4

HttpResponse

render

redirect

JsonResponse

2.HttpResponse

1

HttpResponse()括号内直接跟一个具体的字符串作为响应体,比较直接很简单,所以这里主要介绍后面两种形式。

3.render

1

2

3

4

5

6

7

render(request, template_name[, context])`  `结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。

参数:

     request: 用于生成响应的请求对象。

     template_name:要使用的模板的完整名称,可选的参数

     context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。

 

render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。

4.redirect

1

2

3

4

5

6

7

8

9

传递要重定向的一个硬编码的URL

def my_view(request):

    ...

    return redirect('/some/url/')

    

也可以是一个完整的URL:

def my_view(request):

    ...

    return redirect('http://www.baidu.com/')

5.JsonResponse

1

2

3

4

5

6

7

8

9

向前端返回一个json格式字符串的两种方式

# json.dumps({'name': 'lqz', 'age': 18},ensure_ascii=False) # ensure_ascii  中文不转码

from django.http import JsonResponse

# data = {'name': 'lqz', 'age': 18}

data1 = ['lqz''egon']

# return JsonResponse(data)

# safe=Fals 转换除字典以外的格式需要设置

# json_dumps_params={'ensure_ascii':False} 中文不转码

return JsonResponse(data1,safe=False,json_dumps_params={'ensure_ascii':False})

三、前后端交互编码方式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

1 urlencoded---->传普通的数据,form表单默认就是这种---->request.POST

2 form-data-----》传文件和数据                  ---->request.POST   request.FILES

3 json----------》传json格式数据                ---->request.body中取出来自行处理

 

def index(request):

    # 接收urlencoded编码

    body体中:name=lili&age=18

    # print(request.POST)

 

    

    # 接收form-data编码

    body体中:分两部分,一部分是数据,一部分是文件

    # 数据部分:name=lili&age=18

    print(request.POST)

    # #文件部分

    print(request.FILES)

 

    

    # 接收json格式

    body体中

    {

    "name""lili",

    "age"18

    }

    

    # 这里没有

    print(request.POST)

    # 数据在这(自行处理)

    print(request.body)

 

 

    return HttpResponse('ok')

四、示例:简单文件上传

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# html注意编码方式

# action 可以向第三方地址发送请求

<form action="/index/" method="post" enctype="multipart/form-data">

 

    <p>用户名:<input type="text" name="name"></p>

    <p>密码:<input type="password" name="password"></p>

    <p><input type="file" name="myfile"></p>

    <p><input type="submit" value="提交"></p>

</form>

 

# views.py

def index(request):

    file=request.FILES.get('myfile')

    # 打开一个空文件,写入

    with open(file.name,'wb') as f:

        for line in file.chunks():

            f.write(line)

    return HttpResponse('文件上传成功')


相关文章
|
30天前
|
存储 Shell 数据库
Python编程--Django入门:用户账户(二)
Python编程--Django入门:用户账户(二)
|
30天前
|
存储 数据库 Python
Python编程--Django入门:用户账户(一)
Python编程--Django入门:用户账户(一)
|
3月前
|
前端开发 关系型数据库 Python
Django入门到放弃之分页器
Django入门到放弃之分页器
|
3月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
168 0
|
3月前
|
开发框架 安全 数据库
解锁Django框架神秘面纱!从入门到实战,掌握这些技巧,让你的Web应用秒变高效神器!
【8月更文挑战第31天】Django 是 Python 的明星 Web 开发框架,以其高效、安全及可扩展性著称,适用于构建各类 Web 应用。本文从 Django 基础概念出发,介绍其 MTV 架构,涵盖模型(Model)、模板(Template)、视图(View)等核心组件,并通过示例代码展示实际应用。此外,还将探讨路由配置、管理界面及实战技巧,帮助读者全面掌握 Django,为高效 Web 开发打下坚实基础。
49 0
|
3月前
|
关系型数据库 MySQL 机器人
Django入门到放弃之数据库配置
Django入门到放弃之数据库配置
|
3月前
|
缓存 中间件 数据库
Django入门到放弃之缓存及信号机制
Django入门到放弃之缓存及信号机制
|
3月前
|
前端开发 数据库 数据安全/隐私保护
Django入门到放弃之Auth模块
Django入门到放弃之Auth模块
|
3月前
|
JSON 前端开发 数据安全/隐私保护
Django入门到放弃之CSRF_TOKEN
Django入门到放弃之CSRF_TOKEN
|
3月前
|
前端开发 中间件 索引
Django入门到放弃之中间件
Django入门到放弃之中间件