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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDSClaw,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:,如需转载请自行联系原作者





 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
6月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
773 7
|
6月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
508 0
|
6月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
571 4
|
6月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
650 0
|
6月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
808 0
|
开发者 Python
根据不同的请求返回不同的内容 | 手把手教你入门Python之一百一十二
本节实现根据不同的请求返回不同的内容,使浏览器访问 /register 或 /login 使返回不同的内容。
根据不同的请求返回不同的内容 | 手把手教你入门Python之一百一十二
|
7月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
1096 102
|
7月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
441 104
|
7月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
348 103
|
7月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
317 82

推荐镜像

更多
下一篇
开通oss服务