首页 > 其他分享 >Django基础 - 10请求与响应

Django基础 - 10请求与响应

时间:2023-04-16 20:55:05浏览次数:51  
标签:10 请求 request Django content 响应 user POST name

 

环境准备

# 1. 开启一个新的项目 advanceDjango
(venv) E:\PythonLearn\djangoDemo>django-admin startproject advanceDjango # 2. 配置项目同名APP下的settings.py, advanceDjango/advanceDjango/settings.py ALLOWED_HOSTS = ['*'] TEMPLATES = [
'DIRS': [ os.path.join(BASE_DIR, 'templates') # 配置模板目录 ], # 配置数据库, 更换Sqlite3为MySQL DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django_advance', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'dbman', 'PASSWORD': 'xxxxxx', 'CHARSET': 'utf8' } } # 3. 安装数据库驱动 pymysql, 默认是mysqlclient (venv) E:\PythonLearn\djangoDemo>pip install pymysql # 创建数据库django_advance mysql> create database django_advance default character set 'utf8'; Query OK, 1 row affected, 1 warning (0.01 sec) # 在 advanceDjango/advanceDjango/__init__.py 引入MySQL 初始化 import pymysql pymysql.install_as_MySQLdb()

  

一、 请求与响应之Request

1.1 Request对象

1.1.1 Request 请求对象类; 在视图函数的第一个参数上; 请求是由Django框架生成的

1.1.2 请求对象中的普通信息

  • path:         请求路径
  • method:       请求方法; GET/POST/PUT/DELETE
  • content_type: 数据类型, 如请求头的Context-Type: text/html;charset=utf-8
  • encoding:     编码方式, 如utf-8
  • body:         字节码数据,一般接收上传的json数据

1.1.3 请求对象中的QueryDict属性, QueryDict自动进行url的中文编码处理

  • GET:     查询参数, 包含get请求的所有参数
  • POST:    表单参数, 包含post/put两个请求方法的参数;PUT上传的数据用body来获取
  • COOKIES: 客户端中的当前domain的所有Cookie信息
  • FILES:   上传的表单参数中所有的文件对象
  • session: 会话中存储的数据(可以跨多个请求)
  • META:    客户端的元信息(服务器环境信息、客户端请求信息) REMOTE_ADDR 客户端IP地址
    •     PATH_INFO  REQUEST_METHOD   QUERY_STRING  CONTENT_TYPE

1.1.4 GET/POST 参数

  • 类字典结构; key-value存储数据; key可以重复; 
  • 获取值: GET.get(),获取不到返回None;  GET[key] 获取不到抛出异常;
  • 获取所有值: GET.getlist("")

 

1.2 user应用测试

1.2.1 基础准备, 新增user应用

(venv) E:\PythonLearn\djangoDemo>cd advanceDjango
(venv) E:\PythonLearn\djangoDemo\advanceDjango>django-admin startapp user

1.2.2 定义视图函数

def register(request, user_id=None):
    return render(request, 'register.html', locals())

1.2.3 定义路由

# 定义总路由, 在settings.py 注册应用
    path('user/', include('user.urls', namespace='user')),

 

# 定义子路由
app_name = 'user'
urlpatterns = [ path('register/', views.register, name='register1'), path('register/<user_id>/', views.register, name='register2') ]

1.2.4 编写 templates/register.html

    <p>
        请求路径: {{ request.path }}
        <br/>
        请求URI: {{ request.get_raw_uri }}
        <pre>
            URL: 统一资源定位符, 资源的网络地址
            URI: 统一资源标识符, 用于Restful规范中
        </pre>
    </p>
    <p>
        请求方法: {{ request.method }}
        <br>
        content_type: {{ request.content_type }}
        <br>
        encoding: {{ request.encoding }}
        <br>
        content_params: {{ request.content_params }}
    </p>

 

1.2.5 访问结果 

   

 

1.2.6 访问 http://127.0.0.1:8000/user/register/11a

[10/Apr/2023 22:41:48] "GET /user/register/11a HTTP/1.1" 301 0
[10/Apr/2023 22:41:48] "GET /user/register/11a/ HTTP/1.1" 200 924

 

1.3 GET请求参数

<p>
    <form method="get" enctype="application/x-www-form-urlencoded">
        <input name="name" placeholder="请输入用户名">
        <br>
        <input name="phone" placeholder="手机号">
        <br>
        爱好:
        {% for love in loves %}
            <input type="checkbox"
                   {% if forloop.first or forloop.last %}  # 默认选中第一项和 最后一项
                       checked
                   {% endif %}
                   name="love" value="{{ love }}">{{ love }}
        {% endfor %}
        <br>
        <button>提交</button>
    </form>
</p>

<p>
    GET请求的查询参数
    <ul>
        {% for key, value in request.GET.items %}
            {% ifnotequal key 'love' %}
                <li>{{ key }}:{{ value }}</li>
            {% endifnotequal %}
        {% endfor %}
        <li>
            爱好:
            {% for item in select_loves %}
                {{ item }},
            {% endfor %}
        </li>
    </ul>
</p>

  

def register(request, user_id=None):
    loves = ['H5', 'Python', 'Java', 'GO', 'Linux']
# 获取参数名相同(love)的多个参数值 select_loves = request.GET.getlist('love') return render(request, 'register2.html', locals())

  

访问 /user/register , 输入数据后,点击提交 

1.4 POST请求参数 

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt def register3(request, user_id=None): print(request.POST) print(request.body) return render(request, 'register3.html', locals())

  

<form method="post" enctype="application/x-www-form-urlencoded">
    <input name="name" placeholder="请输入用户名" value="{{ name }}">
    <br>
    <input name="phone" placeholder="手机号" value="{{ phone }}">
    <br>
    <button>提交</button>
</form>
<p>
    POST请求的查询参数
<ul>
    {% for key, value in request.POST.items %}
        <li>{{ key }}:{{ value }}</li>
    {% endfor %}
</ul>
</p>

 

POST返回结果 

<QueryDict: {'name': ['Tom'], 'phone': ['15566665555']}>
b'name=Tom&phone=15566665555'

 

POST请求参数格式

#  es6-form  格式化: key=value&key=value 格式化的字符串
fetch('', {
                method: 'POST',
                body: 'name=' + data.name+'&phone='+data.phone,

 

 

1.5 PUT请求参数 

1.5.1 PUT请求传递json数据

<p>
    <button onclick="up_ajax()">ajax发起PUT请求</button>
    <script>
        function up_ajax() {
            data = {
                name: 'TangSan',
                phone: '15500008753',
                loves: ['数学', 'Python', 'Java', '语文', 'Linux']
            };
            var formdata = document.forms[0]
            formdata.append('name', data.name);
            formdata.append('phone', data.phone)
            fetch('', {
                method: 'PUT',
                body: JSON.stringify(data),
                headers: {
                    'Content-Type': 'application/json;charset=utf-8'
                }
            }).then(response => response.text()).then(html => {
                document.write(html)
            });
        }
    </script>
</p>

<p>
    请求方法: {{ request.method }}   <br>
    PUT请求的参数(body): {{ request.body }} <br>
    content_type: {{ request.content_type }} <br>
    encoding: {{ request.encoding }} <br>
</p>

 

 

1.5.2 PUT请求传输form表单数据

                body: document.forms[0].serialize,
                headers: {
                    {#'Content-Type': 'application/json;charset=utf-8'#}
                    'Content-Type': 'application/x-www-form-urlencoded'
                }

  

1.6 上传文件

<form method="post" enctype="multipart/form-data">
    <input name="name" placeholder="用户名"><br>
    <input name="phone" placeholder="手机号"><br>
    <input type="file" name="img"><br>
    <button>提交</button><br>
</form>

 

from django.core.files.uploadedfile import InMemoryUploadedFile

@csrf_exempt
def register4(request, user_id=None):
    print(request.method)
    print(request.POST)
    print(request.FILES)

    name = request.POST.get('name')
    phone = request.POST.get('phone')
    upload_file: InMemoryUploadedFile = request.FILES.get('img')
    if upload_file:
        print(upload_file.name)
        print(upload_file.content_type)
        print(upload_file.size)
        print(upload_file.charset)
        # print(request.body)
        if all((
                upload_file.content_type.startswith('image/'),
                upload_file.size < 120 * 1024
        )):
            print(request.META.get('REMOTE_ADDR'))
            file_name = name + os.path.splitext(upload_file.name)[-1]
            # images 目录必须存在, advanceDjango项目目录下
            with open('images/' + file_name, 'wb') as f:
                for chunk in upload_file.chunks():
                    f.write(chunk)
                f.flush()
            return HttpResponse('上传文件成功')
        return HttpResponse('请上传小于120KB的图片')
    return render(request, 'register4.html', locals())

  

POST
<QueryDict: {'name': ['Jack'], 'phone': ['15566667777']}>
<MultiValueDict: {'img': [<InMemoryUploadedFile: Django目录结构.png (image/png)>]}>

 

Django目录结构.png
image/png
54811
None

 

当保存图片等文件时,目录不存在会报错

 

二、 请求与响应之Response

2.1 response对象

响应对象是视图函数返回的对象。需自行创建,可由render()/redirect()快速生成response响应对象。

常用的响应类: HttpResponse、 HttpResponseRedirect、 JsonResponse

常用属性与方法:
  • content: 响应内容,必须是bytes类型的数据       charset: 编码格式
  • status: 响应状态码(200, 3xx, 404, 5xx)      content_type: MIME类型
  • init(): 初始化内容    write(): 直接写出文本  flush(): 刷新缓冲区
增加响应头:
  • 响应对象中存在着 _headers 私有的字典对象 HttpResponseBase类。
  • 在Django中, response对象具有dict的特性。 response['Content-Type'] = value

2.2 返回JSON格式数据

def register5(request):
    # 返回字符串格式的文本
    resp1 = HttpResponse(content='您好'.encode('utf-8'), status=200, content_type='text/html;charset=utf-8')

    # 返回图片
    with open('images/Jack.png', 'rb') as f:
        png_data = f.read()
    resp2 = HttpResponse(content=png_data, content_type='image/png')
    resp2.setdefault('Content-Length', len(png_data))

    # 返回Json格式的数据
    json_data = {'name': 'Jackson', 'age': 20}
    resp3 = HttpResponse(content=json.dumps(json_data), content_type='application/json')

    # 使用JsonResponse返回Json数据
    resp4 = JsonResponse(json_data)
    return resp4

 

返回图片

 

标签:10,请求,request,Django,content,响应,user,POST,name
From: https://www.cnblogs.com/kingdomer/p/17297472.html

相关文章

  • Django基础 - 06Model模型的关联关系及对象继承
     一、 一对一关系:实名认证表一对一关系: models.OneToOneField主表的数据是相对重要的(UserEntity), 从表需要主动声明关系(RealProfile)对象获取: 从表获取主表数据, 直接使用字段, 对象.字段名.属性名; 主表获取从表数据: 隐性的, 对象.模型名.属性名1.1 声明一对一......
  • 先机XJ18A10块钱的随身wifi 刷入debian
      就是这个淘宝十块钱包邮。兄弟们冲呀薅秃它。 刷机包https://pan.baidu.com/s/1aialm5sRlgodtaDud8a_Dw?pwd=guz5  刷机包  详细教程可以参考高通410的随身WiFi刷入Debian教程_你干嘛-哎哟的博客-CSDN博客开源项目地址开始折腾·OpenStick项目·看云(kanclou......
  • django保存图片并返回url
    场景描述前端传递一个表单,表单中有title,description,以及image等信息,image在这里传递的是二进制文件后端需要将这些数据保存到一个数据库中。image需要保存到指定文件夹下,并且数据库中保存的是image的路径,之后我们可以通过浏览器访问类似127.0.0.1:8000/xxx/a.jpg访问到这......
  • 麒麟v10sp2+php+dm8数据库配置
    1.使用yum安装的自带的PHP,默认扩展模块的路径为/usr/lib64/php/modules,将对应版本的驱动文件(libphp72_dm.so,php72_pdo_dm.so)拷贝到/usr/lib64/php/modules下。默认扩展模块路径查看:php-i|grep-iextension_dir2.vim/etc/php.ini文件中添加:extension=libphp72_dm.so3.......
  • Topcoder 10880 - Rabbit Problemming
    \[兔子,兔子,兔子\]首先,我们考虑一只兔子可以达到的最大值\(mx_i\)和最小值\(mn_i\),这个可以很方便的求出来。并且每只兔子的取值是独立的。然后,如果一个组合能被选中,那么在这个组合内部所有的兔子都取\(mx_i\),其他的兔子都取\(mn_i\)的时候一定也能被选中。我们就钦定所有......
  • 10分钟理解React生命周期
    前言学习React,生命周期很重要,我们了解完生命周期的各个组件,对写高性能组件会有很大的帮助.一、简介React /riˈækt/ 组件的生命周期指的是组件从创建到销毁过程中所经历的一系列方法调用。这些方法可以让我们在不同的时刻执行特定的代码,以满足组件的需求。React的生命周期......
  • Topcoder 10880 - Functional Equation
    首先分析一下这个鬼畜的函数,我们考虑\(f(x)+2C\)\(=f(2f(x)-x+1)+C\)\(=f(2f(2f(x)-x+1)-(2f(x)-x+1)+1)\)\(=f(2(f(x)+C)-2f(x)+x-1+1)\)\(=f(x+2C)\)也就是\(f(x)=f(x\bmod2C)+2C\lfloor\dfrac{x}{2C}\rfloor\)也就是,只要决定了\(f(x)\),\(f(x+2mC)\)也就被确定了。......
  • 汉源高科高清DVI音视频光端机dvi光纤收发器延长器1080P分辨率
    汉源高科高清DVI音视频光端机dvi光纤收发器延长器1080P分辨率......
  • 汉源高科4K-DVI光端机10公里实时传输dvi光纤延长器非压缩DVI大屏收发器
    汉源高科4K-DVI光端机10公里实时传输dvi光纤延长器非压缩DVI大屏收发器......
  • P3205 [HNOI2010]合唱队
    P3205[HNOI2010]合唱队区间DP——取一端思:根据题意我们发现,每次排队的时候,会出现两种情况当前排入的人(即初始队列最后一人)比初始队列中前一个人矮,排到最左边当前排入的人(同上)比初始队列中前一个人高,排到最右边可从初始队列最后一人切入。设置状态:\(f[l][r][0/1]\)......