django 文件上传和菜单分级,mysql支持事务,F模块自增字段, python发送get,post请求

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
+关注继续查看
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
一、文件上传
方法一
 
上传文件视图函数
def upload_img(request):
    obj = request.FILES.get('file')    #前端js设置的key
 
    img_path = os.path.join('static','img',obj.name)
 
    with open(img_path,mode='wb') as f:
        for chunk in obj.chunks():
            f.write(chunk)
    data = {
        'status'True,
        'path': img_path
    }
    import json
    return HttpResponse(json.dumps(data))
     
     
前端页面
form表单
            <form>
                  <div class="form-group">
                    <label for="exampleInputFile">上传图片</label>
                    <input type="file" id="exampleInputFile">
                      <button type="button" class="btn btn-default" id="uploadfile">上传</button>
{#                    <p class="help-block">Example block-level help text here.</p>#}
                  </div>
 
                  <div class="form-group">
                      <label for="select_news">选择新闻类型</label>
                      <select class="form-control" id="select_news">
                          <option>42区</option>
                          <option>段子</option>
                          <option>图片</option>
                          <option>挨踢1024</option>
                          <option>你问我答</option>
                      </select>
                  </div>
                  <div class="form-group">
                    <label for="news_url">新闻链接</label>
                    <input type="text" class="form-control" id="news_url" placeholder="Url">
                  </div>
 
                  <div class="form-group">
                    <label for="news_title">新闻标题</label>
                    <textarea class="form-control" rows="3" id="news_title"></textarea>
                  </div>
 
                  <div class="form-group">
                    <label for="news_summary">新闻简介</label>
                    <textarea class="form-control" rows="3" id="news_summary"></textarea>
                  </div>
 
                  <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                    <button type="button" class="btn btn-primary" id="news_publish">提交</button>
                  </div>
              </form>
               
 
js 通过FormData方法处理
$(document).ready(function () {
    $('#uploadfile').click(function () {
        var formData = new FormData();
        formData.append('file',$('#exampleInputFile')[0].files[0]);
        $.ajax({
            url: '/upload',
            type'POST',
            data: formData,
            processData: false, //添加这两个参数,表示将原生文件发到后台
            contentType: false,
            success: function (res) {
                console.log(res);
            }
        })
    })
});
 
 
 
方法二
 
前端页面用form和iframe组合伪造ajax提交
<form method="POST" target="xxxxxx" action="/upload_img2/" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="text" name="user" />
        <a style="width: 60px;height: 30px;background-color: darkslateblue;color: white;display: inline-block;position: relative;">
            上传
            <input type="file" name="avatar" style="opacity: 0;position: absolute;left: 0;top:0;right: 0;bottom: 0;" />
        </a>
        <input type="submit" value="提交" />
</form>
<iframe id="ifm" name="xxxxxx" onload="successCallback(this);" style="display: none;" ></iframe>
 
注: form属性target的值必须和iframe的name属性值一样
 
 
view视图函数处理上传请求
def upload_img2(request):
    response = BaseResponse()
    try:
        user = request.POST.get('user')    #处理post请求
        obj = request.FILES.get('avatar')    #处理上传文件
        img_path = os.path.join('static''img', obj.name)
        with open(img_path,mode='wb') as f:
            for chunk in obj.chunks():
                f.write(chunk)
    except Exception as e:
        response.msg = str(e)
    else:
        response.status = True
        response.data = img_path
    return HttpResponse(json.dumps(response.get_dict()))
     
 
 
二、django对mysql事务的支持
view视图
 
import json
from django.db.models import F    # F模块实现数据库字段自增
from django.db import transaction    #支持事务原子性,对数据库的连续操作,操作成功必须每个sql都成功,否则都失败
from utils.response import LikeResponse
 
def do_like(request):
    """
    点赞
    :param request:
    :return:
    """
    response = LikeResponse()
    try:
        new_id = request.POST.get('newId')
        # 当前登录用户ID
        # uid = request.session.get('uid')
        uid = 1
 
        exist_like = models.Like.objects.filter(nnew_id=new_id,uuser_id=uid).count()
        with transaction.atomic():    #事务
            if exist_like:
                models.Like.objects.filter(nnew_id=new_id, uuser_id=uid).delete()
                models.News.objects.filter(id=new_id).update(like_count=F('like_count'- 1)
                response.code = 666
            else:
                models.Like.objects.create(nnew_id=new_id,uuser_id=uid)
                models.News.objects.filter(id=new_id).update(like_count=F('like_count'+ 1)
                response.code = 999
    except Exception as e:
        response.msg = str(e)
    else:
        response.status = True
    return HttpResponse(json.dumps(response.get_dict()))
     
     
  三、多级菜单,多级评论
   
view视图
from django.shortcuts import render, HttpResponse, redirect
 
# Create your views here.
import json
from django.db.models import F
from app01 import models
from django.db import transaction
from utils.response import LikeResponse
 
def comment_list(request):
    li = [
        {'id'1'user''银秋良''content''灌我鸟事''parent_id'None},
        {'id'2'user''银秋良''content''管我鸟事''parent_id'None},
        {'id'3'user''型谱''content''你个文盲''parent_id'1},
        {'id'4'user''详解''content''好羡慕你们这些没脸的人呀''parent_id'2},
        {'id'5'user''银秋良''content''你是流氓''parent_id'3},
        {'id'6'user''银秋良''content''你冷库无情''parent_id'5},
        {'id'7'user''银秋良''content''你才冷酷无情''parent_id'4},
        {'id'8'user''银秋良''content''你无理取闹''parent_id'4},
    ]
 
    com_list = build_comment_data(li)
    html = build_comment_tree(com_list)
 
    return render(request, 'comment_list.html', {'comment_html': html})
  
 #将列表子元素放入父级元素中   
def build_comment_data(li):
    dic = {}
    for item in li:
        item['children'= []
        dic[item['id']] = item
 
    result = []
    for item in li:
        pid = item['parent_id']
        if pid:
            dic[pid]['children'].append(item)
        else:
            result.append(item)
    return result
 
#生成 html页面
def build_comment_tree(com_list):
    tpl = """
    <div class='item'>
        <div class='title'>{0}:{1}</div>
        <div class='body'>{2}</div>
    </div>
    """
 
    html = ""
    for item in com_list:
        if not item['children']:
            html += tpl.format(item['user'],item['content'],"")
        else:
            html += tpl.format(item['user'], item['content'], build_comment_tree(item['children']))
    return html
     
comment_list.html页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .body{
            margin-left: 30px;
        }
        .hide{
            display: none;
        }
 
    </style>
</head>
<body>
    <h1>评论</h1>
    {{ comment_html|safe }}
 
    <h1>菜单</h1>
    <hr/>
    <script src="/static/jquery-3.1.1.js"></script>
    <script>
        $(function () {
            $('.title').click(function () {
                if ($(this).next().hasClass('hide')){
                    $(this).next().removeClass('hide');
                }else{
                    $(this).next().addClass('hide');
                }
            })
        })
    </script>
 
</body>
</html>
 
四、python实现get和post请求
客户端:
import requests
response = requests.get('
 
传递字典类型参数
data_dict = {
'k1':'v1',
'k2':'v2'
}
content-type: application/x-www-form-urlencoded 
response = requests.post('
 print(response.text)
  
传递json类型参数
content-type: appcation/json
response = requests.post('
 print(response.text)
  
  
 服务端Django:
 from django.views.decorators.csrf import csrf_exempt,csrf_protect
 @csrf_exempt
 def asset(request):
 if request.method == "GET":
     return HttpResponse('收到:GET')
 else:
     print(request.POST)
     print(request.body)
 return HttpResponse('收到:POST')
 






     本文转自小白的希望 51CTO博客,原文链接http://blog.51cto.com/haoyonghui/1968750:,如需转载请自行联系原作者





 

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 存储 关系型数据库
Mysql 的InnoDB引擎下支持hash索引吗?
Mysql 的InnoDB引擎下支持hash索引吗?
655 0
Mysql 的InnoDB引擎下支持hash索引吗?
|
SQL 关系型数据库 MySQL
请简洁描述Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?
请简洁描述Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?
110 0
|
关系型数据库 MySQL 数据库
MYSQL支持事务吗?
MYSQL支持事务吗?
72 0
|
SQL Web App开发 关系型数据库
MySQL---决策支持的基本测试标准TPC-DS测试数据的生成及导入
TPC-DS是tpc组织提供的官方决策支持基本测试标准,这个标准的数据对于决策支持的学习和测试很有帮助,怎样生成测试数据及将测试数据导入到MySQL数据库,可以参阅本文。
994 0
MySQL---决策支持的基本测试标准TPC-DS测试数据的生成及导入
|
SQL 负载均衡 关系型数据库
mysql支持哪些复制
mysql支持哪些复制
220 0
|
移动开发 关系型数据库 MySQL
《MySQL数据操作与查询》- 维护学生信息、老师信息和成绩信息 支持按多种条件组合查询学生信息和成绩信息
《MySQL数据操作与查询》- 维护学生信息、老师信息和成绩信息 支持按多种条件组合查询学生信息和成绩信息
126 0
《MySQL数据操作与查询》- 维护学生信息、老师信息和成绩信息 支持按多种条件组合查询学生信息和成绩信息
|
存储 安全 算法
MySQL 数据库支持国密算法
数据库加密,作为杀手锏,是数据库底线防守的秘密武器,通过在数据库存储层进行数据加密处理,达到即使数据被黑客盗取也无法解密的效果,从根源上解决数据泄露问题。 近年,市场对于数据库加密产品的需求呈上升趋势,但由于技术门槛极高,国内真正能够提供此类产品的企业本就寥寥无几,尤其针对全球份额排名第二的MySQL数据库,能够对其支持的加密产品一直没有出现。 不同于传统的视图+触发器模式的透明加密方式,本文所提MySQL国密加密产品采用数据库引擎代码改造技术,真正实现数据在存储层的加、解密功能,避免以往加密过程中,数据库文件导入导出的繁琐方法,最大程度减少性能损失。 产品是为用户需求而生,而我们要做的
1256 0
|
SQL 关系型数据库 MySQL
|
存储 SQL 关系型数据库
PolarDB-X 1.0-常见问题-数据兼容问题-PolarDB-X支持MySQL的存储过程、跨库外键和级联删除等高级特性吗?
目前PolarDB-X不支持存储过程、跨库外键和级联删除。如果需要自定义函数,请尝试通过组合MySQL标准函数解决。详情请参见SQL使用限制。
222 0
|
cobar 运维 Oracle
yugong阿里巴巴去Oracle数据迁移同步工具(全量+增量,目标支持MySQL/DRDS)
2008年,阿里巴巴开始尝试使用 MySQL 支撑其业务,开发了围绕 MySQL 相关的中间件和工具,Cobar/TDDL(目前为阿里云DRDS产品),解决了单机 Oracle 无法满足的扩展性问题,当时也掀起一股去IOE项目的浪潮,愚公这项目因此而诞生,其要解决的目标就是帮助用户完成从 Oracle 数据迁移到 MySQL 上,完成去 IOE 的重要一步工作。
yugong阿里巴巴去Oracle数据迁移同步工具(全量+增量,目标支持MySQL/DRDS)
相关产品
云迁移中心
推荐文章
更多