HTTP协议向服务器传参有几种方式?Django中如何获取各类参数?
1.提取URL的特定部分,如/jd/beer/2001, 可以在服务器端的路由中用正则表达式截取:
reverse() ---返解析
可以通过name 动态获取路径(路由)
在工程urls.py文件未配置了namespace,可以直接通过name获取路由地址:reverse('路由地址/')
在工程urls.py文件配置了namespace,在views.py中获取路由地址就需要:reverse('namespace: name')
配置namespace:
方法一:在项目的路由文件url.py中配置;
from django.contrib import admin
from django.urls import path, include
from book import urls
urlpatterns = [
path('admin/', admin.site.urls),
# 方式子应用里面的urls.py中的name参数与其他子应用重复
# 处理办法在incould的第二个参数中添加 namespace
# 这样子应用里面urls.py就变成了 namespace: name, views里面传页面参数的时候就需要reverse('book': 'index')
path('', include((urls, 'book'), namespace='book')), # includ((子应用路由, '子应用名'), namespace='子应用名')
]
方法二:在子应用的url.py文件中添加app_name = ‘子应用名’属性:
from django.conf.urls import re_path
from book.views import index
# app_name = 'book' # 在子应用中定义app_name = '子应用名' 防止子应用路由地址name与其他子应用name重复
urlpatterns = [
# name 就是给url起个名字
# 可以通过name找到这个路由
re_path('index/', index, name='index'),
]
配置后再views.py中获取路由需要使用reverse('namespace: name')格式
2.查询字符串(query string),如key1=value1&key2=value2;
views中获取url参数:
子应用中用正则关键字去匹配url中的参数,在视图中通过关键字去直接取值:
子应用urls.py
from django.conf.urls import re_path
from book.views import index, detail
# app_name = 'book' # 在子应用中定义app_name = '子应用名' 防止子应用路由地址name与其他子应用name重复
urlpatterns = [
# name 就是给url起个名字
# 可以通过name找到这个路由
re_path('index/', index, name='index'),
# 根据位置来获取 url的位置参数
re_path('(?P<category_id>\d+)/(?P<book_id>\d+)/', detail) # ?P<book_id> 给分组参数起别名,使之让其与视图中使用的参数一致
]
子应用views.py
def detail(request, category_id, book_id):
print(category_id, book_id)
return HttpResponse('detail')
# 3 100 访问的url:http//:127.0.0.1:8000/3/100/
views中获取get请求的url参数:
GET请求地址:http://127.0.0.1:8000/3/100/?user=itcast&pwd=%27123qweasd%27&pwd=%27123qweasd%27
def detail(request, category_id, book_id):
print(category_id, book_id) # # 3 100
query_par = request.GET
print(query_par)
# <QueryDict: {'user': ['itcast'], 'pwd': ["'123qweasd'", "'123qweasd'"]}>
# QueryDict 一键一值的时候可以用key或者get()来取值
user = query_par['user']
print(user) # itcast
# 一键多值的时候默认取最后的那个值,所以多值的时候要使用getlist()
pwd = query_par['pwd']
print(pwd) # '123qweasd'
pwds = query_par.getlist('pwd')
print(pwds) # ["'123qweasd'", "'123qweasd'"]
return HttpResponse('detail')
3.请求体(body)中发送的数据。比如:表单数据、json、xml;
表单提交:
def detail(request, category_id, book_id):
data = request.POST
print(data)
return HttpResponse('detail') # <QueryDict: {'username': ['itcast'], 'password': ['123']}>
json提交:
def detail(request, category_id, book_id):
data = request.body
print(data) # b'{\n\t"username":"itcast",\n\t"password":"123"\n}'
data_info = data.decode()
print(data_info)
"""
{
"username":"itcast",
"password":"123"
}
"""
"""
json.dumps 将字典转换为json形式的字符串
json.loads 将json形式的字符串转成字典
"""
data_dic = json.loads(data_info)
print(data_dic)
return HttpResponse('detail')
4.请求头header里面传输数据;
def detail(request, category_id, book_id):
print(request.META)
"""
{'ALLUSERSPROFILE': 'C:\\ProgramData', 'ANDROID_HOME': 'C:\\Program Files (x86)\\Android\\android-sdk', 'APPDATA': 'C:\\Users\\chenhongyan\\AppData\\Roaming', 'CHOCOLATEYINSTALL': 'C:\\ProgramData\\chocolatey', 'CHOCOLATEYLASTPATHUPDATE': '132560190167966216', 'CLASSPAHTH': '.;C:\\Program Files\\Java\\jdk1.8.0_77\\lib\\dt.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\lib\\tools.jar;', 'CLASSPATH': 'D:\\Jmeter\\apache-jmeter-5.2.1\\lib\\ext\\ApacheJMeter_core.jar; D:\\Jmeter\\apache-jmeter-5.2.1\\lib\\jorphan.jar; .;C:\\Program Files\\Java\\jdk1.8.0_77\\lib\\dt.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\lib\\tools.jar;', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'DESKTOP-VDSH280', 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 'DJANGO_SETTINGS_MODULE': 'bookmanager02.settings', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer', 'FPS_BROWSER_USER_PROFILE_STRING': 'Default', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\chenhongyan', 'IDEA_INITIAL_DIRECTORY': 'C:\\Users\\chenhongyan\\Desktop', 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_77', 'JMETER_HOME': 'D:\\Jmeter\\apache-jmeter-5.2.1', 'LOCALAPPDATA': 'C:\\Users\\chenhongyan\\AppData\\Local', 'LOGONSERVER': '\\\\DESKTOP-VDSH280', 'NUMBER_OF_PROCESSORS': '4', 'ONEDRIVE': 'C:\\Users\\chenhongyan\\OneDrive', 'OS': 'Windows_NT', 'PATH': 'D:\\Pycharm\\Project\\bookmanager\\venv\\Scripts;C:\\Python39\\Scripts\\;C:\\Python39\\;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Python38\\Scripts\\;C:\\Python38\\;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;D:\\Jmeter\\apache-jmeter-5.2.1\\bin;D:\\Git\\Git\\cmd;C:\\ProgramData\\chocolatey\\bin;C:\\Program Files\\Java\\jdk1.8.0_77\\bin;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\bin;D:\\Xftp\\;C:\\Program Files\\nodejs\\;C:\\Program Files (x86)\\Android\\android-sdk\\tools;C:\\Program Files (x86)\\Android\\android-sdk\\platform-tools;C:\\Program Files (x86)\\Android\\android-sdk\\platform-tools;C:\\Users\\chenhongyan\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Program Files\\Java\\jdk1.8.0_77\\bin;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\bin;"C:\\Windows\\system32;C:\\Windows;";D:\\Pycharm\\PyCharm 2019.2.4\\bin;;C:\\Users\\chenhongyan\\AppData\\Roaming\\npm;D:\\VsCode\\Microsoft VS Code\\bin', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 78 Stepping 3, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '4e03', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files', 'PROMPT': '(venv) $P$G', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM': 'D:\\Pycharm\\PyCharm 2019.2.4\\bin;', 'PYCHARM_DISPLAY_PORT': '63342', 'PYCHARM_HOSTED': '1', 'PYTHONIOENCODING': 'UTF-8', 'PYTHONPATH': 'D:\\Pycharm\\Project\\bookmanager02;D:\\Pycharm\\PyCharm 2019.2.4\\helpers\\pycharm_matplotlib_backend;D:\\Pycharm\\PyCharm 2019.2.4\\helpers\\pycharm_display', 'PYTHONUNBUFFERED': '1', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\Windows', 'TEMP': 'C:\\Users\\CHENHO~1\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\CHENHO~1\\AppData\\Local\\Temp', 'USERDOMAIN': 'DESKTOP-VDSH280', 'USERDOMAIN_ROAMINGPROFILE': 'DESKTOP-VDSH280', 'USERNAME': 'chenhongyan', 'USERPROFILE': 'C:\\Users\\chenhongyan', 'VIRTUAL_ENV': 'D:\\Pycharm\\Project\\bookmanager\\venv', 'WINDIR': 'C:\\Windows', '_OLD_VIRTUAL_PATH': 'C:\\Python39\\Scripts\\;C:\\Python39\\;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Python38\\Scripts\\;C:\\Python38\\;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;D:\\Jmeter\\apache-jmeter-5.2.1\\bin;D:\\Git\\Git\\cmd;C:\\ProgramData\\chocolatey\\bin;C:\\Program Files\\Java\\jdk1.8.0_77\\bin;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\bin;D:\\Xftp\\;C:\\Program Files\\nodejs\\;C:\\Program Files (x86)\\Android\\android-sdk\\tools;C:\\Program Files (x86)\\Android\\android-sdk\\platform-tools;C:\\Program Files (x86)\\Android\\android-sdk\\platform-tools;C:\\Users\\chenhongyan\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Program Files\\Java\\jdk1.8.0_77\\bin;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\bin;"C:\\Windows\\system32;C:\\Windows;";D:\\Pycharm\\PyCharm 2019.2.4\\bin;;C:\\Users\\chenhongyan\\AppData\\Roaming\\npm;D:\\VsCode\\Microsoft VS Code\\bin', '_OLD_VIRTUAL_PROMPT': '$P$G', 'RUN_MAIN': 'true', 'SERVER_NAME': 'activate.navicat.com', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8000', 'REMOTE_HOST': '', 'CONTENT_LENGTH': '43', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': 'POST', 'PATH_INFO': '/1/200/', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1', 'CONTENT_TYPE': 'application/json', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0', 'HTTP_REFERER': 'http://www.necn.shop/html/purchaser/memberCenter.html?pageTag=%E6%88%91%E7%9A%84%E9%A6%96%E9%A1%B5&root_menu_code=startPage', 'HTTP_COOKIE': 'SERVERID=f9c45de760b871a2671eae854c282be3|1548393723|1548393689; JSESSIONID=0802FC717F2C085897673E129D5ACED3', 'HTTP_CACHE_CONTROL': 'no-cache', 'HTTP_POSTMAN_TOKEN': '85464b4d-d72c-4dbc-9406-7edf0dbbef2a', 'HTTP_ACCEPT': '*/*', 'HTTP_HOST': '127.0.0.1:8000', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_CONNECTION': 'keep-alive', 'wsgi.input': <django.core.handlers.wsgi.LimitedStream object at 0x000001668F9F08C8>, '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.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>}
"""
content_type = request.META['CONTENT_TYPE'] # request.META 返回的是字典对象
print(content_type) # application/json
return HttpResponse('detail')
5.其他常用的HTTPResponset对象属性;
method:一个字符串,表示请求使用的HTTP方法,常用值包括POST、GET;
user:请求的用户对象;
path:一个字符串,表示请求的页面的完整路径,不含域名和参数部分;
encoding:一个字符串,表示提交数据的编码格式;(①如果为None则表示使用浏览器请求的默认设置,一般为utf-8;②这个属性是可编辑的,可通过修改它的值来修改表单编码格式,接下来对属性的任何访问将使用心得encoding值);
FILES:一个类似字典的对象,包含的是上上传的文件;
直接传字典返回json格式数据:
from django.http import JsonResponse
def detail(request, category_id, book_id):
data = {'name': 'ticast'}
print(data) # {"name": "ticast"}
return JsonResponse(data) # JsonResponse可以直接将字典转换为json格式返给前段
指定跳转页面:
def detail(request, category_id, book_id):
redirect_path = reverse('book:index') # reverse()会动态回去url,应对路由的变化此处reverse()传值参考上面配置
return redirect(redirect_path) # 页面跳转