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

简介:
+关注继续查看
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
相关文章
|
1月前
|
存储 数据库 数据安全/隐私保护
django -- auth模块
django -- auth模块
|
8月前
|
iOS开发 Python
Python实现微信消息连续发送
Python实现微信消息连续发送
Python实现微信消息连续发送
|
8月前
|
JSON 数据格式 Python
python POST发送多个段(如json消息+文件)
python POST发送多个段(如json消息+文件)
121 0
|
9月前
|
Go Python
Python和Go 同时发送文件和formdata请求
Python和Go 同时发送文件和formdata请求
150 0
|
9月前
|
Linux Python
python脚本,从mongo取数据发送html格式表格邮件
python脚本,从mongo取数据发送html格式表格邮件
98 0
|
9月前
|
网络安全 数据安全/隐私保护 Python
进阶——python——邮件的发送与收取(收取邮件)
进阶——python——邮件的发送与收取(收取邮件)
|
9月前
|
网络协议 Python
进阶——python——邮件的发送与收取(发送邮件)
进阶——python——邮件的发送与收取(发送邮件)
进阶——python——邮件的发送与收取(发送邮件)
|
9月前
|
SQL 监控 关系型数据库
【python小脚本】监听日志文件异常数据发送告警短信
老项目中有个用脚本启动的服务,很重要,用来做业务留痕的,涉及业务客户经常性投诉,是找第三方做的,时间长了维护需要花钱,老出各种未知bug,没办法处理所以机器上配了定时任务,定期的几天重启一次来解决。 但是有时候不知道什么原因,重启脚本运行,服务没起来,crond 也没有什么调度机制。 希望写个脚本做监控,当发现服务没起来,发送告警信息,或者重启服务。
104 0
|
9月前
|
JSON jenkins 持续交付
python接口自动化(十一)--发送post【data】(详解)
前面登录博客园的是传 json 参数,由于其登录机制的改变没办法演示,然而在工作中有些登录不是传 json 的,如 jenkins 的登录,这里小编就以jenkins 登录为案例,传 data 参数,给各位童鞋详细演练一下。
117 0
python接口自动化(十一)--发送post【data】(详解)
|
9月前
|
JSON 网络安全 数据格式
python接口自动化(八)--发送post请求的接口(详解)
上篇介绍完发送get请求的接口,大家必然联想到发送post请求的接口也不会太难,被聪明的你又猜到了。答案是对的,虽然发送post请求的参考例子很简单,但是实际遇到的情况却是很复杂的,因为所有系统或者软件、网站都是从登录开 始的,进入这扇门才可以发现里边的奥秘,所以首先介绍的第一个post请求肯定是登录了,但登录是最难处理的。如果把登录问题这只拦路虎解决了,那么后面问题都迎刃而解。
350 1
python接口自动化(八)--发送post请求的接口(详解)
相关产品
云迁移中心
推荐文章
更多