1、request对象

  1. print("返回用户访问的url,但是不包括域名",request.path_info)
  2. print("返回请求的方法,全大写",request.method)
  3. print("返回HTTPde GET参数的类的字典对象",request.GET)
  4. print("返回HTTPde POST参数的类的字典对象", request.POST)
  5. print("请求体",request.body)

  

结果如下:

2、form上传文件

首先看下form表单该如何写

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form method="post" action="/app1/upload/" enctype="multipart/form-data">
  9. {% csrf_token %}
  10. <input type="file" placeholder="上传文件" name="file">
  11. <input type="submit" value="提交">
  12.  
  13. </form>
  14. </body>
  15. </html>

  

重点是这里

然后看下后端视图函数,用request.FILES方法获取上传的文件的对象

  1. def upload(request):
  2. method = request.method.lower()
  3. if method == "get":
  4. return render(request,"upload.html")
  5. else:
  6. # print(dir(request))
  7.  
  8. file_name = request.FILES["file"].name
  9.  
  10. name = request.FILES.get("file").name
  11. size = request.FILES.get("file").size
  12. print("---------->",dir(request.FILES.get("file")))
  13. print(name,size)
  14. import os
  15. new_file_path = os.path.join("static","upload",name)
  16. with open(new_file_path,"wb") as f:
  17. for chunks in request.FILES.get("file").chunks():
  18. f.write(chunks)
  19.  
  20. return HttpResponse(file_name)

  

3、视图函数返回json字符串的三种方法

  1. def js(request):
  2. ret = {"name":"xiaocui","age":23}
  3.  
  4. # 视图函数返回json字符串,有下面三种方法
  5.  
  6. # 方法1
  7. import json
  8.  
  9. return HttpResponse(json.dumps(ret))
  10.  
  11. # 方法2
  12.  
  13. from django.http import JsonResponse
  14. return JsonResponse(ret)
  15.  
  16. # 默认情况下JsonResponse只能转换字典为js的字符串,如果是列表是转换不成jsson的字符串d的,如果要转换列表为js字符串则使用下面的方法
  17.  
  18. # 方法3
  19. from django.http import JsonResponse
  20. return JsonResponse(ret,safe=False)
  21.  
  22. # 告诉JsonResponse不要为我做安全监察

  

4、路由系统中的别名

我们可以为urls.py中的路由系统取一个别名,这样,如果我们的匹配规则变了,我们还是可以通过别名去访问这个路由映射的函数,用法如下

  1. urlpatterns = [
  2. url(r'^publish/', views.publish,name="publish_index"),
  3. url(r'^add_publish/', views.addpublish,name="publish_add"),
  4. url(r'^del_publish/', views.delpublish,name="publish_del"),
  5. url(r'^edit_publish/', views.editpublish,name="publish_edit"),
  6. url(r'^auther/', views.auther,name="auther_index"),
  7. url(r'^book/', views.book,name="book_index"),
  8. url(r'^add_book/', views.addbook,name="book_add"),
  9. url(r'^edit_book/', views.editbook,name="book_edit"),
  10. url(r'^test/', views.test,name="test"),
  11. url(r'^upload/', views.upload,name="upload"),
  12. url(r'^js/', views.js,name="js"),
  13. # url(r'^base/', views.base),
  14. url(r'^router/[0-9]{1,3}/[a-z]{1,3}/$', views.router, name="router"),
  15. url(r'^router_one/([0-9]{1,3})/([a-z]{1,3})/$', views.router_one, name="router_one"),
  16. url(r'^router_two/(?P<arg2>[0-9]{1,3})/(?P<arg3>[a-z]{1,3})/$', views.router_two, name="router_two"),
  17. url(r'^url1/', views.url1,name="url_one"),
  18. url(r'^url2/', views.url2,name="url_two"),
  19.  
  20. ]

  

这个name就是我们为这条路由取的别名,那么我们在html文件中就可以通过别名去访问这个路由,记住,这里对应的别名需要用单引号括起来才能生效

  1. <a href="{% url 'url_two' %}">跳转到url2</a>

  

如果urls中的别名对应的路由需要传递参数,我们该如何传递呢,在html中传递参数,只能通过位置参数来传递,传递的方法如下

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>url1的主页</h1>
  9. <p>友情链接</p>
  10. <a href="{% url 'router_two' '123' 'abc' %}">跳转到url2</a>
  11. </body>
  12. </html>

  

这个a标签跳转到router_two这个命令别名对应的路由,我们在看这个路由

  1. url(r'^router_two/(?P<arg2>[0-9]{1,3})/(?P<arg3>[a-z]{1,3})/$', views.router_two, name="router_two"),

  

所有arg2就是“123”,arg3就是“abc”

上面我们介绍的是在html文件中使用url的别名,我们还可以在视图函数中使用路由别名

需要导入一个reverse模块,然后通过这个模块找到别名对应的url,然后通过redirect返回找到的url就可以了

  1. from django.urls import reverse
  2.  
  3. def url3(request):
  4. red_url = reverse("publish_index")
  5.  
  6. return redirect(red_url)

  

同样,如果视图函数需要传递参数,在视图函数中该如何传递参数呢,可以使用下面的方式

  1. def url3(request):
  2. red_url = reverse("router_two",kwargs={"arg2":"123","arg3":"aaa"})
  3.  
  4. return redirect(red_url)

  

这样,指定red_url对应的路由,会传递2个参数过去,arg2为123,arg3为aaa,这个是分组命令匹配

如果分组位置匹配,则传递参数就不能用kwargs了,需要用args=("123","aaa"),则123就会赋值给url中的第一个参数,aaa就会赋值给url中的第二个参数

5、路由系统中的参数匹配

  1. url(r'^router/[0-9]{1,3}/[a-z]{1,3}/$', views.router, name="router"),
  2. url(r'^router_one/([0-9]{1,3})/([a-z]{1,3})/$', views.router_one, name="router_one"),
  3. url(r'^router_two/(?P<arg2>[0-9]{1,3})/(?P<arg3>[a-z]{1,3})/$', views.router_two, name="router_two"),

  

第一条路由映射不会向后台传递任何参数,仅仅是是一个正则的匹配规则

  1. def router(request):
  2. l = ["aa","bb","cc","dd"]
  3. from django.http import JsonResponse
  4. return JsonResponse(l,safe=False)

  

第二条路由映射会向后台传递参数,传递的位置参数,因为这里有2个括号,所以在视图函数中必须要接受3个形参,第一个是request,第二个是第一个括号中匹配到的字符串,第三个是第二个括号中匹配到的字符串

  1. def router_one(request,arg1,arg2):
  2.  
  3. l = []
  4. l.append(arg1)
  5. l.append(arg2)
  6.  
  7. from django.http import JsonResponse
  8.  
  9. return JsonResponse(l,safe=False)

  

第三条路由映射向后台传递参数,传递的命名参数,其中第一个括号中的字符串被赋值给变量arg2,第二个括号中的字符串会赋值给变量arg3,这样,我们在视图函数中可以通过arg2和arg3来获取url中匹配到的字符串

  1. def router_two(request,arg2,arg3):
  2. l = []
  3. l.append(arg2)
  4. l.append(arg3)
  5.  
  6. from django.http import JsonResponse
  7.  
  8. return JsonResponse(l,safe=False)

  

django中的request参数中有很多的方法

  1. ['COOKIES', 'FILES', 'GET', 'POST', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__it
  2. er__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_encoding', '_get_post', '_get_
  3. raw_host', '_get_scheme', '_initialize_handlers', '_load_post_and_files', '_mark_post_parse_error', '_set_post', '_upload_handlers', 'body', 'build_absolute_uri', 'close', 'encoding', 'get_full_path', 'get_host',
  4. 'get_port', 'get_raw_uri', 'get_signed_cookie', 'is_ajax', 'is_secure', 'parse_file_upload', 'read', 'readline', 'readlines', 'scheme', 'upload_handlers', 'xreadlines']

  

这里有有个很重要的属性就是META,这里包含很多的信息,他是字典,我们可以通过get方法去获取我们需要的属性,必须客户端的ip之类的信息

  1. {'LOCALAPPDATA': 'C:\\Users\\Administrator\\AppData\\Local', 'PROCESSOR_LEVEL': '6', 'FP_NO_HOST_CHECK': 'NO', 'PROMPT': '$P$G', 'USERDOMAIN': 'VDP', 'LOGONSERVER': '\\\\WIN-B5TQAQI491H', 'JAVA_HOME': 'C:\\Progra
  2. m Files\\Java', 'SESSIONNAME': 'RDP-Tcp#0', 'ALLUSERSPROFILE': 'C:\\ProgramData', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\', 'SYSTEMDRIVE': 'C:
  3. ', 'JRE_HOME': 'C:\\Program Files\\Java\\jre7', 'APPDATA': 'C:\\Users\\Administrator\\AppData\\Roaming', 'MOZ_PLUGIN_PATH': 'C:\\Program Files (x86)\\Foxit Software\\Foxit Reader\\plugins\\', 'USERNAME': 'Adminis
  4. trator', 'USERDNSDOMAIN': 'VDP.COM', 'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Commo
  5. n Files', 'PATH': 'C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Program Files (x86)\\Common Files\\NetSarang;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\
  6. v1.0\\;C:\\Program Files\\FalconStor\\IMA\\;C:\\Windows\\idmu\\common;C:\\Program Files\\MySQL\\MySQL Utilities 1.6\\;C:\\Program Files\\Python36\\Scripts\\;C:\\Program Files\\Python36;C:\\sqlite;C:\\Program File
  7. s\\Java\\jdk1.7.0_51\\bin;C:\\Program Files\\Java\\jre7\\bin', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'OS': 'Windows_NT', 'WINDOWS_TRACING_FLAGS': '3', 'COMPUTERNAME': 'WIN-B5TQAQI491
  8. H', 'PROCESSOR_REVISION': '3a09', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMW6432': 'C:\\Program Files', 'HOME
  9. PATH': '\\Users\\Administrator', 'SYSTEMROOT': 'C:\\Windows', 'TEMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\2', 'HOMEDRIVE': 'C:', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
  10. ', 'USERPROFILE': 'C:\\Users\\Administrator', 'TMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\2', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'PROGRAMFILES': 'C:\\Program Files', 'PUBLI
  11. C': 'C:\\Users\\Public', 'NUMBER_OF_PROCESSORS': '8', 'WINDIR': 'C:\\Windows', 'CLIENTNAME': 'SANGFOR-PC', 'DJANGO_SETTINGS_MODULE': 'hadoop_project.settings', 'RUN_MAIN': 'true', 'SERVER_NAME': 'WIN-B5TQAQI491H.
  12. vdp.com', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8080', 'REMOTE_HOST': '', 'CONTENT_LENGTH': '', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': '
  13. GET', 'PATH_INFO': '/admin/jsi18n/', 'QUERY_STRING': '', 'REMOTE_ADDR': '200.200.216.215', 'CONTENT_TYPE': 'text/plain', 'HTTP_HOST': '10.87.6.1:8080', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_USER_AGENT': 'Mozilla
  14. /5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', 'HTTP_ACCEPT': '*/*', 'HTTP_REFERER': 'http://10.87.6.1:8080/admin/app1/projecttalbe/', 'HTTP_ACCEPT_ENCODING': 'g
  15. zip, deflate', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9', 'HTTP_COOKIE': 'csrftoken=xQpWwE2TEG8gM4O7M8EwN4uUxiC4cTaL8BmQ6lirfnwdscir1DMLxCWLGobBL1SX; sessionid=53lverenz02qbpk0lywk25ydqug8p8ib', 'wsgi.input': <_io
  16. .BufferedReader name=668>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': True, 'wsgi.
  17. multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>}

  

这里我们就在中间件的通过request的META方法获取客户端的ip,然后进行序列化存储

  1. import json
  2. import os
  3. class My_first_middle(MiddlewareMixin):
  4.  
  5. def process_request(self,request):
  6. a = os.path.abspath(__file__)
  7. file_path = os.path.dirname(os.path.dirname(a)) + "\\" + "request_ip.text"
  8. file_obj = open(file_path, "r", encoding="utf-8")
  9. client_ip_list = json.load(file_obj)
  10.  
  11. # print(client_ip_list,type(client_ip_list))
  12. # print(request.get_full_path())
  13.  
  14. client_ip = request.META.get("REMOTE_ADDR")
  15. print(dir(request))
  16. print(request.META)
  17. if client_ip in client_ip_list:
  18. pass
  19.  
  20. else:
  21. client_ip_list.append(client_ip)
  22.  
  23. for m,n in enumerate(client_ip_list,1):
  24. print(m,n,sep="------------>")
  25.  
  26. print("这是一个中间件的process_request")
  27.  
  28. file_obj = open(file_path,"w",encoding="utf-8")
  29.  
  30. json.dump(client_ip_list,file_obj,indent=4)

  

Django的视图函数和路由系统中一些没有用过的小点的更多相关文章

  1. Django之视图函数总结

    Django之视图函数总结 HttpRequest与HttpResponse http请求中产生两个核心对象: HttpRequest对象:用户请求相关的所有信息(对象) HttpResponse对象 ...

  2. day 66 Django基础二之URL路由系统

    Django基础二之URL路由系统   本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...

  3. day 53 Django基础二之URL路由系统

    Django基础二之URL路由系统   本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...

  4. 03 Django之视图函数

    一.Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python函数(类),它接受WEB请求并返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...

  5. django views视图函数返回值 return redirect httpresponse总结

    django views视图函数返回值 return redirect  render httpresponse总结

  6. Django 定义视图函数

    Django 定义视图函数 一.接收内容及文件处理 1.接收分类 # 获取数据 request.GET # 提交数据 request.POST # 获取文件 request.FILES 2.check ...

  7. Django基础二之URL路由系统

    一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...

  8. Django之(URL)路由系统

    路由系统 简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从而返回给客户 ...

  9. 02.Django基础二之URL路由系统

    一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...

随机推荐

  1. 我要重新开始学习C++了!

    C++实在是博大精深!之前总不想读厚厚的C++ Primer. 然而,现在的水平真的只是初学者!只是因为写的代码太简单,所以没有用到一些特性.可以说还是门外汉! 写笔记!

  2. css-图片垂直居中

    1. img { vertical-align: middle; }   2. <body> <div> <img src="1.jpg" alt=& ...

  3. css:关于position和float

    在CSS中,我们是通过定位属性position来进行定位的,具体它有如下几个属性值.常见的属性有如下几个: absolute  生成绝对定位的元素,相对于static定位以外的第一个父元素进行定位.元 ...

  4. C++ 连接Oracle

    下面是一个ADO方式连接Oracle的小程序部分代码...... 首先是Oracle的配置.在Oracle的安装路径下找到:Oracle\network\ADMIN\tnsnames.ora文件.配置 ...

  5. C++17尝鲜:string_view

    string_view string_view 是C++17所提供的用于处理只读字符串的轻量对象.这里后缀 view 的意思是只读的视图. 通过调用 string_view 构造器可将字符串转换为 s ...

  6. Hibernate学习笔记2.4(Hibernate的Id生成策略)

    通过设置告诉id该怎么设置. 1.通过xml方式 1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据 ...

  7. js 表单序列化为json对象

    $.fn.serializeJson = function () { var o = {}; var a = this.serializeArray(); $.each(a, function () ...

  8. cv2.SIFT() AttributeError: 'module' object has no attribute 'SIFT' OpenCV Python can't use SURF, SIFT

    参考链接: https://stackoverflow.com/questions/18561910/opencv-python-cant-use-surf-sift For recent infor ...

  9. Java的学习04

    今天依旧记录一下,学习的东西. import java.io.File; import java.io.IOException; import java.util.Date; /** * 测试File ...

  10. 11.15java课后作业

    1,编写一个程序,指定一个文件夹,能自动计算出其总容量 package Account; import java.io.File; import java.util.ArrayList; public ...