Django--Views

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)  # 页面跳转

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值