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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:
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:,如需转载请自行联系原作者





 

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
348
分享
相关文章
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
Python 请求微店商品详情数据 API 接口
微店开放平台允许开发者通过API获取商品详情数据。使用Python请求微店商品详情API的主要步骤包括:1. 注册并申请API权限,获得app_key和app_secret;2. 确定API接口地址与请求参数,如商品ID;3. 生成签名确保请求安全合法;4. 使用requests库发送HTTP请求获取数据;5. 处理返回的JSON格式响应数据。开发时需严格遵循微店API文档要求。
对象存储OSS-Python设置代理访问请求
通过 Python SDK 配置 nginx 代理地址请求阿里云 OSS 存储桶服务。示例代码展示了如何使用 RAM 账号进行身份验证,并通过代理下载指定对象到本地文件。
167 15
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
111 3
Python中如何判断是否为AJAX请求
AJAX请求是Web开发中常见的异步数据交互方式,允许不重新加载页面即与服务器通信。在Python的Django和Flask框架中,判断AJAX请求可通过检查请求头中的`X-Requested-With`字段实现。Django提供`request.is_ajax()`方法,Flask则需手动检查该头部。本文详解这两种框架的实现方法,并附带代码示例,涵盖安全性、兼容性、调试及前端配合等内容,帮助开发者提升Web应用性能与用户体验。
72 0
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
203 82
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
235 42

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等