Django+小程序实现图片上传功能

一、先完成Django部分

  1、先定一个类来完成图片功能,简单来说:在浏览器上只给图片名,直接返回图片(这里的类我取名为“ImageView”,注:这个ImageView类所在的路径是resources文件中的images文件),具体操作如下:

  (1)先在settings中配置图片路径,配置如下:

#配置图片路径
RESOURCES_DIR = os.path.join(BASE_DIR,'resources')
IMAGES_DIR = os.path.join(RESOURCES_DIR,'images')

Django+小程序实现图片上传功能

  

  (2)再定一个文件,取名为“utils”,在utils文件中创建response.py的python文件,接下来再配置response.py,具体配置如下:

    展示所创建的response.py,如下:

    Django+小程序实现图片上传功能

 

    之后,再配置response.py,配置如下:

Django+小程序实现图片上传功能
# 状态码
class ReturnCode:
    SUCCESS = 0

    FAILED = -100
    WRONG_PARMAS = -101
    RESOURCE_NOT_FOUND = -102

    UNAUTHORIZED = -500
    BROKEN_AUTHORIZED_DATA = -501

    @classmethod
    def message(cls, code):
        if code == cls.SUCCESS:
            return 'success'
        elif code == cls.FAILED:
            return 'failed'
        elif code == cls.UNAUTHORIZED:
            return 'unauthorized'
        elif code == cls.WRONG_PARMAS:
            return 'wrong params'
        elif code == cls.RESOURCE_NOT_FOUND:
            return 'resources not found'


def wrap_json_response(data=None, code=None, message=None):
    response = {}
    if not code:
        code = ReturnCode.SUCCESS
    if not message:
        message = ReturnCode.message(code)
    if data :
        response['data'] = data
    response['result_code'] = code
    response['message'] = message
    return response


#Mixin继承
class CommnResponseMixin(object):
    @classmethod
    def wrap_json_response(cls, data=None,code=None,message=None):
        response = {}
        if not code:
            code = ReturnCode.SUCCESS
        if not message:
            message = ReturnCode.message(code)
        if data:
            response['data'] = data
        response['result_code'] = code
        response['message'] = message
        return response
response.py的代码

 

  (3)所定义的ImageView类整体代码,如下:

Django+小程序实现图片上传功能
import os
from django.http import Http404, HttpResponse,FileResponse,JsonResponse
from git01 import settings
import utils
from django.views import View
import hashlib

from utils.response import ReturnCode


#定义类视图,主要优化以上的功能
class ImageView(View, utils.response.CommnResponseMixin):#utils.response.CommnResponseMixin是继承CommnResponseMixin类

    #这里处理get请求
    def get(self, request):
        # 接收参数
        md5 = request.GET.get("md5")

        # os.path.join的作用:1.用于路径拼接文件路径。2.还可以传入多个路径
        # 这里是结合settings设置中所配置的图片路径,在加上md5所获得数据进行拼接
        imgfile = os.path.join(settings.IMAGES_DIR, md5 + '.jpg')   #这里是进行拼接

        # 判断是否找到图片
        if not os.path.exists(imgfile):
            return Http404()
        else:
            #读取第一种方法:
            # data = open(imgfile, 'rb').read()
            # content_type代表是什么内容,简单来说就是防止乱码的出现
            # 注:解析图片这里有二种方法,具体如下:
            # 第一种方法:使用HttpResponse来解析图片
            # return HttpResponse(content=data,content_type="image/jpg")
            # 第二种方法:使用FileResponse来解析图片

            #读取第二种方法:
            return FileResponse(open(imgfile, 'rb'), content_type="image/jpg")
    def post(self, request):
        """
        实现图片上传功能
        :param request: 
        :return: 
        """
        files = request.FILES
        #遍历
        response =[]
        for key, value in files.items():
            content = value.read()
            md5 = hashlib.md5(content).hexdigest()
            path = os.path.join(settings.IMAGES_DIR, md5 + '.jpg')
            with open(path, 'wb') as f:
                f.write(content)
            response.append({
                "name": key,
                "md5": md5
            })
        message = '这是关于post方法'
        # resonse = utils.response.wrap_json_response(message=message)
        # 继承以后,直接调用CommnResponseMixin类中的wrap_json_response方法,这样的好处就是减少耦合度
        response = self.wrap_json_response(data=response, code=ReturnCode.SUCCESS,message=message)
        return JsonResponse(data=response,safe=False)

    def delete(self, request):
        """
        删除图片功能
        :param request: 
        :return: 
        """
        #获取md5数据
        md5 = request.GET.get("md5")

        #判断图片是否存在
        img_name = md5 + '.jpg'
        path = os.path.join(settings.IMAGES_DIR, img_name)
        if os.path.exists(path):
            os.remove(path)
        else:
            message = '%s文件存在' %(img_name)
        # resonse = utils.response.wrap_json_response(message=message)
        # 继承以后,直接调用CommnResponseMixin类中的wrap_json_response方法,这样的好处就是减少耦合度
        response = self.wrap_json_response(code=ReturnCode.SUCCESS, message=message)
        return JsonResponse(data=response, safe=False)

    def put(self, request):
        message = '这是关于put方法'
        # resonse = utils.response.wrap_json_response(message=message)
        #继承以后,直接调用CommnResponseMixin类中的wrap_json_response方法,这样的好处就是减少耦合度
        response = self.wrap_json_response(message=message)
        return JsonResponse(data=response, safe=False)
ImageView类完整代码

  

  (4)关于images文件所在什么地方,具体如下:

    Django+小程序实现图片上传功能

 

  (5)配置urls路径,首先这里定义了两个urls路径,具体如下:


    首先是本项目文件中的urls.py进行接收apis文件中的urls.py,具体配置如下:
      Django+小程序实现图片上传功能

 

    然后再配置pais文件中的urls.py,如下:

      Django+小程序实现图片上传功能

  

 2、最终效果:

  (1)url路径也配置好以后,那怎么在浏览器上进行访问?

    其实是这样访问,如下:http://127.0.0.1:8000/index/image?md5=图片名,举例:http://127.0.0.1:8000/index/image?md5=6f7aead081b3bf1dfe1734ef07d0d99d。这里的index是本项目中的urls.py设置的,image是在apis文件中的urls.py设置的,其实以上设置的名称也可以根据自己来设置。

 

    注:前提是你的images文件中有图片存在,才可以达到理想的效果。在“md5=图片名”中的这个图片名不需要加上图片的后缀名。

 

  (2)整体的效果,如下:

    Django+小程序实现图片上传功能

 

 二、完成小程序部分

 

  1、在pages文件下创建backup文件夹,专门来实现图片功能,backup文件夹包括js、json、wxml、wxss等这四个文件,之后再是对这些文件进行操作,具体操作如下:

  (1)先创建backup文件夹,如下:

    Django+小程序实现图片上传功能

   

  (2)先配置backup.wxml,如下:

Django+小程序实现图片上传功能
<view class="page" data-weui-theme="{{theme}}">
  <view class="page__hd">
    <view class="page__title">图片备份</view>
  </view>
  <view class="page__bd">
    <view class="weui-cells">
      <view class="weui-cell">
        <view class="weui-cell__bd">
          <view class="weui-uploader">
            <view class="weui-uploader__hd">
              <view class="weui-uploader__title">上传图片</view>
              <view class="weui-uploader_info">{{files.length}}</view>
            </view>
            <view class="weui-uploader__bd">
              <view class="weui-uploader__files" id="uploaderFiles">
                <block wx:for="{{needUploadFiles}}" wx:key="*this">
                  <view class="weui-uploader__file" data-type="UploadView" bind:longpress="longTapConfirm" data-id="{{item}}">
                    <image class="weui-uploader__img" src="{{item}}" mode="aspectFill" />
                  </view>
                </block>
              </view>
              <view class="weui-uploader__input-box">
                <view class="weui-uploader__input" bindtap="chooseImage"></view>
              </view>
            </view>
          </view>
        </view>
      </view>
    </view>
    <view class="page__bd page__bd_spacing button-sp-area">
      <button class="weui-btn" type="primary" bindtap='uploadFiles'>确认上传</button>
      <button class="weui-btn" type="primary" bindtap='downloadFile'>下载图片</button>
      <button class="weui-btn" type="primary" bindtap='deleteBackup'>删除图片</button>
    </view>



    <!-- 已上传图片 -->
    <view class="weui-cells">
      <view class="text-center">已备份图片</view>
      <view class="weui-cell" wx:for="{{downloadedBackupedFiles}}">
        <image class="" src="{{item}}" mode="aspectFill" data-index="{{index}}" data-type="DownloadedView" bindlongtap="longTapConfirm" />
      </view>
    </view>
    <view class='text-center' wx:if="{{downloadedBackupedFiles.length == 0}}">暂无</view>
  </view>
</view>
backup整体代码

 

   (3)再配置backup.js,具体如下:

Django+小程序实现图片上传功能
const app = getApp()
const imageUrl = app.globalData.serverUrl + app.globalData.apiVersion //这里可以理解为路径拼接

Page({
  data: {
    // 需要上传的图片
    needUploadFiles: [],
    // 已下载的备份图片
    downloadedBackupedFiles: [],
  },

  // 选择图片上传
  chooseImage: function(e) {
    var that = this;
    wx.chooseImage({
      sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
      sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
      success: function(res) {
        // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
        that.setData({
          needUploadFiles: that.data.needUploadFiles.concat(res.tempFilePaths)
        });
      }
    })
  },

  // 上传图片文件
  uploadFiles: function() {
    for(var i=0;i<this.data.needUploadFiles.length;i++){
      var filePath= this.data.needUploadFiles[i]
      wx.uploadFile({
        filePath: filePath,
        name: 'test',
        url: imageUrl,
        success: function(res){
          //打印结果
          console.log(res)
        }
      })
    }
  }
});
backup.js整体代码

 

  2、在该文件中具体配置app.js、app.json、app.wxss,具体操作如下:

  (1)先配置app.js,具体如下:

Django+小程序实现图片上传功能
//app.js
App({
  onLaunch: function () {
    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
      }
    })
    // 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo

              // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    })
  },
  onShow: function(){},
  onHide: function(){},
  globalData: {
    userInfo: null,
    serverUrl: 'http://127.0.0.1:8000',
    apiVersion: '/index/image'
  }
})
app.js整体代码

   注:①app.js中的serverUrl必须要跟Django的url路径一致。在以上的代码中的url是127.0.0.0:8000,而Django中的url也是127.0.0.0:8000,举例:如果我只该小程序的路径,改为127.0.0.0:8001,再运行小程序时,会发现出现“uploadFile:fail Error: connect ECONNREFUSED 127.0.0.1:8001”的问题,所以小程序中的路径和Django的路径必须要一致。 ②apiVersion就是根据Django中的urls来设置,所以也需要一致。 

     

   (2)接下来继续配置app.json,由于创建backup文件夹,所以需要在pages集合中定义,具体如下:

   Django+小程序实现图片上传功能

 

   (3)在底部导航栏添加相关图片的子网页,主要用来实现图片功能,具体配置如下(还是在app.json文件下配置):

   Django+小程序实现图片上传功能

 

   (4)再看看底部导航栏是否有“图片”存在,效果如下:
   Django+小程序实现图片上传功能

 

  (5)以下就是关于app.json整体代码:

Django+小程序实现图片上传功能
{
  "pages": [
    "pages/index/index",
    "pages/userConsole/userConsole",
    "pages/storageConsole/storageConsole",
    "pages/databaseGuide/databaseGuide",
    "pages/addFunction/addFunction",
    "pages/deployFunctions/deployFunctions",
    "pages/chooseLib/chooseLib",
    "pages/openapi/openapi",
    "pages/openapi/serverapi/serverapi",
    "pages/openapi/callback/callback",
    "pages/openapi/cloudid/cloudid",
    "pages/im/im",
    "pages/logs/logs",
    "pages/im/room/room",
    "pages/menu/menu",
    "pages/backup/backup"
  ],
  "window": {
    "backgroundColor": "#F6F6F6",
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#F6F6F6",
    "navigationBarTitleText": "云开发 QuickStart",
    "navigationBarTextStyle": "black"
  },
  "tabBar": {
    "list": [
      {
        "pagePath": "pages/index/index",
        "text": "首页"
       
      },
      {
        "pagePath": "pages/logs/logs",
        "text": "日志"
      },
      {
        "pagePath": "pages/menu/menu",
        "text": "应用"
      },
      {
        "pagePath": "pages/backup/backup",
        "text": "图片"
      }
    ]
  },
  "sitemapLocation": "sitemap.json",
  "style": "v2"
}
app.json代码

 

   (6)优化自己的app.wxss代码:

Django+小程序实现图片上传功能
 page {
  line-height: 1.6;
  font-family: -apple-system-font, Helvetica Neue, sans-serif
}

icon {
  vertical-align: middle
}

.weui-cells {
  position: relative;
  margin-top: 1.17647059em;
  background-color: #fff;
  line-height: 1.41176471;
  font-size: 17px
}

.weui-cells:before {
  top: 0;
  border-top: 1rpx solid #d9d9d9
}

.weui-cells:after,
.weui-cells:before {
  content: " ";
  position: absolute;
  left: 0;
  right: 0;
  height: 1px;
  color: #d9d9d9
}

.weui-cells:after {
  bottom: 0;
  border-bottom: 1rpx solid #d9d9d9
}

.weui-cells__title {
  margin-top: .77em;
  margin-bottom: .3em;
  padding-left: 15px;
  padding-right: 15px;
  color: #999;
  font-size: 14px
}

.weui-cells_after-title {
  margin-top: 0
}

.weui-cells__tips {
  margin-top: .3em;
  color: #999;
  padding-left: 15px;
  padding-right: 15px;
  font-size: 14px
}

.weui-cell {
  padding: 10px 15px;
  position: relative;
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
  align-items: center
}

.weui-cell:before {
  content: " ";
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  height: 1px;
  border-top: 1rpx solid #d9d9d9;
  color: #d9d9d9;
  left: 15px
}

.weui-cell:first-child:before {
  display: none
}

.weui-cell_active {
  background-color: #ececec
}

.weui-cell_primary {
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
  align-items: flex-start
}

.weui-cell__bd {
  -webkit-box-flex: 1;
  -webkit-flex: 1;
  flex: 1
}

.weui-cell__ft {
  text-align: right;
  color: #999
}

.weui-cell_access {
  color: inherit
}

.weui-cell__ft_in-access {
  padding-right: 13px;
  position: relative
}

.weui-cell__ft_in-access:after {
  content: " ";
  display: inline-block;
  height: 6px;
  width: 6px;
  border-width: 2px 2px 0 0;
  border-color: #c8c8cd;
  border-style: solid;
  -webkit-transform: matrix(.71, .71, -.71, .71, 0, 0);
  transform: matrix(.71, .71, -.71, .71, 0, 0);
  position: relative;
  top: -2px;
  position: absolute;
  top: 50%;
  margin-top: -4px;
  right: 2px
}

.weui-cell_link {
  color: #586c94;
  font-size: 14px
}

.weui-cell_link:active {
  background-color: #ececec
}

.weui-cell_link:first-child:before {
  display: block
}

.weui-icon-radio {
  margin-left: 3.2px;
  margin-right: 3.2px
}

.weui-icon-checkbox_circle,
.weui-icon-checkbox_success {
  margin-left: 4.6px;
  margin-right: 4.6px
}

.weui-check__label:active {
  background-color: #ececec
}

.weui-check {
  position: absolute;
  left: -9999px
}

.weui-check__hd_in-checkbox {
  padding-right: .35em
}

.weui-cell__ft_in-radio {
  padding-left: .35em
}

.weui-cell_input {
  padding-top: 0;
  padding-bottom: 0
}

.weui-label {
  width: 105px;
  word-wrap: break-word;
  word-break: break-all
}

.weui-input {
  height: 2.58823529em;
  min-height: 2.58823529em;
  line-height: 2.58823529em
}

.weui-toptips {
  position: fixed;
  -webkit-transform: translateZ(0);
  transform: translateZ(0);
  top: 0;
  left: 0;
  right: 0;
  padding: 5px;
  font-size: 14px;
  text-align: center;
  color: #fff;
  z-index: 5000;
  word-wrap: break-word;
  word-break: break-all
}

.weui-toptips_warn {
  background-color: #e64340
}

.weui-textarea {
  display: block;
  width: 100%
}

.weui-textarea-counter {
  color: #b2b2b2;
  text-align: right
}

.weui-cell_warn,
.weui-textarea-counter_warn {
  color: #e64340
}

.weui-form-preview {
  position: relative;
  background-color: #fff
}

.weui-form-preview:before {
  top: 0;
  border-top: 1rpx solid #d9d9d9
}

.weui-form-preview:after,
.weui-form-preview:before {
  content: " ";
  position: absolute;
  left: 0;
  right: 0;
  height: 1px;
  color: #d9d9d9
}

.weui-form-preview:after {
  bottom: 0;
  border-bottom: 1rpx solid #d9d9d9
}

.weui-form-preview__value {
  font-size: 14px
}

.weui-form-preview__value_in-hd {
  font-size: 26px
}

.weui-form-preview__hd {
  position: relative;
  padding: 10px 15px;
  text-align: right;
  line-height: 2.5em
}

.weui-form-preview__hd:after {
  content: " ";
  position: absolute;
  left: 0;
  bottom: 0;
  right: 0;
  height: 1px;
  border-bottom: 1rpx solid #d9d9d9;
  color: #d9d9d9;
  left: 15px
}

.weui-form-preview__bd {
  padding: 10px 15px;
  font-size: .9em;
  text-align: right;
  color: #999;
  line-height: 2
}

.weui-form-preview__ft {
  position: relative;
  line-height: 50px;
  display: -webkit-box;
  display: -webkit-flex;
  display: flex
}

.weui-form-preview__ft:after {
  content: " ";
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  height: 1px;
  border-top: 1rpx solid #d5d5d6;
  color: #d5d5d6
}

.weui-form-preview__item {
  overflow: hidden
}

.weui-form-preview__label {
  float: left;
  margin-right: 1em;
  min-width: 4em;
  color: #999;
  text-align: justify;
  text-align-last: justify
}

.weui-form-preview__value {
  display: block;
  overflow: hidden;
  word-break: normal;
  word-wrap: break-word
}

.weui-form-preview__btn {
  position: relative;
  display: block;
  -webkit-box-flex: 1;
  -webkit-flex: 1;
  flex: 1;
  color: #3cc51f;
  text-align: center
}

.weui-form-preview__btn:after {
  content: " ";
  position: absolute;
  left: 0;
  top: 0;
  width: 1px;
  bottom: 0;
  border-left: 1rpx solid #d5d5d6;
  color: #d5d5d6
}

.weui-form-preview__btn:first-child:after {
  display: none
}

.weui-form-preview__btn_active {
  background-color: #eee
}

.weui-form-preview__btn_default {
  color: #999
}

.weui-form-preview__btn_primary {
  color: #0bb20c
}

.weui-cell_select {
  padding: 0
}

.weui-select {
  position: relative;
  padding-left: 15px;
  padding-right: 30px;
  height: 2.58823529em;
  min-height: 2.58823529em;
  line-height: 2.58823529em;
  border-right: 1rpx solid #d9d9d9
}

.weui-select:before {
  content: " ";
  display: inline-block;
  height: 6px;
  width: 6px;
  border-width: 2px 2px 0 0;
  border-color: #c8c8cd;
  border-style: solid;
  -webkit-transform: matrix(.71, .71, -.71, .71, 0, 0);
  transform: matrix(.71, .71, -.71, .71, 0, 0);
  position: relative;
  top: -2px;
  position: absolute;
  top: 50%;
  right: 15px;
  margin-top: -4px
}

.weui-select_in-select-after {
  padding-left: 0
}

.weui-cell__bd_in-select-before,
.weui-cell__hd_in-select-after {
  padding-left: 15px
}

.weui-cell_vcode {
  padding-right: 0
}

.weui-vcode-btn,
.weui-vcode-img {
  margin-left: 5px;
  height: 2.58823529em;
  vertical-align: middle
}

.weui-vcode-btn {
  display: inline-block;
  padding: 0 .6em 0 .7em;
  border-left: 1px solid #e5e5e5;
  line-height: 2.58823529em;
  font-size: 17px;
  color: #3cc51f;
  white-space: nowrap
}

.weui-vcode-btn:active {
  color: #52a341
}

.weui-cell_switch {
  padding-top: 6px;
  padding-bottom: 6px
}

.weui-uploader__hd {
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  padding-bottom: 10px;
  -webkit-box-align: center;
  -webkit-align-items: center;
  align-items: center
}

.weui-uploader__title {
  -webkit-box-flex: 1;
  -webkit-flex: 1;
  flex: 1
}

.weui-uploader__info {
  color: #b2b2b2
}

.weui-uploader__bd {
  margin-bottom: -4px;
  margin-right: -9px;
  overflow: hidden
}

.weui-uploader__file {
  float: left;
  margin-right: 9px;
  margin-bottom: 9px
}

.weui-uploader__img {
  display: block;
  width: 79px;
  height: 79px
}

.weui-uploader__file_status {
  position: relative
}

.weui-uploader__file_status:before {
  content: " ";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: rgba(0, 0, 0, .5)
}

.weui-uploader__file-content {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
  color: #fff
}

.weui-uploader__input-box {
  float: left;
  position: relative;
  margin-right: 9px;
  margin-bottom: 9px;
  width: 77px;
  height: 77px;
  border: 1px solid #d9d9d9
}

.weui-uploader__input-box:after,
.weui-uploader__input-box:before {
  content: " ";
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
  background-color: #d9d9d9
}

.weui-uploader__input-box:before {
  width: 2px;
  height: 39.5px
}

.weui-uploader__input-box:after {
  width: 39.5px;
  height: 2px
}

.weui-uploader__input-box:active {
  border-color: #999
}

.weui-uploader__input-box:active:after,
.weui-uploader__input-box:active:before {
  background-color: #999
}

.weui-uploader__input {
  position: absolute;
  z-index: 1;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  opacity: 0
}

.weui-article {
  padding: 20px 15px;
  font-size: 15px
}

.weui-article__section {
  margin-bottom: 1.5em
}

.weui-article__h1 {
  font-size: 18px;
  font-weight: 400;
  margin-bottom: .9em
}

.weui-article__h2 {
  font-size: 16px;
  font-weight: 400;
  margin-bottom: .34em
}

.weui-article__h3 {
  font-weight: 400;
  font-size: 15px;
  margin-bottom: .34em
}

.weui-article__p {
  margin: 0 0 .8em
}

.weui-msg {
  padding-top: 36px;
  text-align: center
}

.weui-msg__link {
  display: inline;
  color: #586c94
}

.weui-msg__icon-area {
  margin-bottom: 30px
}

.weui-msg__text-area {
  margin-bottom: 25px;
  padding: 0 20px
}

.weui-msg__title {
  margin-bottom: 5px;
  font-weight: 400;
  font-size: 20px
}

.weui-msg__desc {
  font-size: 14px;
  color: #999
}

.weui-msg__opr-area {
  margin-bottom: 25px
}

.weui-msg__extra-area {
  margin-bottom: 15px;
  font-size: 14px;
  color: #999
}

@media screen and (min-height:438px) {
  .weui-msg__extra-area {
    position: fixed;
    left: 0;
    bottom: 0;
    width: 100%;
    text-align: center
  }
}

.weui-flex {
  display: -webkit-box;
  display: -webkit-flex;
  display: flex
}

.weui-flex__item {
  -webkit-box-flex: 1;
  -webkit-flex: 1;
  flex: 1
}

.weui-btn {
  margin-top: 15px
}

.weui-btn:first-child {
  margin-top: 0
}

.weui-btn-area {
  margin: 1.17647059em 15px .3em
}

.weui-agree {
  display: block;
  padding: .5em 15px;
  font-size: 13px
}

.weui-agree__text {
  color: #999
}

.weui-agree__link {
  display: inline;
  color: #586c94
}

.weui-agree__checkbox {
  position: absolute;
  left: -9999px
}

.weui-agree__checkbox-icon {
  position: relative;
  top: 2px;
  display: inline-block;
  border: 1px solid #d1d1d1;
  background-color: #fff;
  border-radius: 3px;
  width: 11px;
  height: 11px
}

.weui-agree__checkbox-icon-check {
  position: absolute;
  top: 1px;
  left: 1px
}

.weui-footer {
  color: #999;
  font-size: 14px;
  text-align: center
}

.weui-footer_fixed-bottom {
  position: fixed;
  bottom: .52em;
  left: 0;
  right: 0
}

.weui-footer__links {
  font-size: 0
}

.weui-footer__link {
  display: inline-block;
  vertical-align: top;
  margin: 0 .62em;
  position: relative;
  font-size: 14px;
  color: #586c94
}

.weui-footer__link:before {
  content: " ";
  position: absolute;
  left: 0;
  top: 0;
  width: 1px;
  bottom: 0;
  border-left: 1rpx solid #c7c7c7;
  color: #c7c7c7;
  left: -.65em;
  top: .36em;
  bottom: .36em
}

.weui-footer__link:first-child:before {
  display: none
}

.weui-footer__text {
  padding: 0 .34em;
  font-size: 12px
}

.weui-grids {
  border-top: 1rpx solid #d9d9d9;
  border-left: 1rpx solid #d9d9d9;
  overflow: hidden
}

.weui-grid {
  position: relative;
  float: left;
  padding: 20px 10px;
  width: 33.33333333%;
  box-sizing: border-box;
  border-right: 1rpx solid #d9d9d9;
  border-bottom: 1rpx solid #d9d9d9
}

.weui-grid_active {
  background-color: #ececec
}

.weui-grid__icon {
  display: block;
  width: 28px;
  height: 28px;
  margin: 0 auto
}

.weui-grid__label {
  margin-top: 5px;
  display: block;
  text-align: center;
  color: #000;
  font-size: 14px;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden
}

.weui-loading {
  margin: 0 5px;
  width: 20px;
  height: 20px;
  display: inline-block;
  vertical-align: middle;
  -webkit-animation: a 1s steps(12) infinite;
  animation: a 1s steps(12) infinite;
  background: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat;
  background-size: 100%
}

.weui-loading.weui-loading_transparent {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect xmlns='http://www.w3.org/2000/svg' width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.56)' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.5)' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.43)' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.38)' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.32)' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.28)' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.25)' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.2)' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.17)' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.14)' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.1)' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.03)' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E")
}

@-webkit-keyframes a {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg)
  }

  to {
    -webkit-transform: rotate(1turn);
    transform: rotate(1turn)
  }
}

@keyframes a {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg)
  }

  to {
    -webkit-transform: rotate(1turn);
    transform: rotate(1turn)
  }
}

.weui-badge {
  display: inline-block;
  padding: .15em .4em;
  min-width: 8px;
  border-radius: 18px;
  background-color: #e64340;
  color: #fff;
  line-height: 1.2;
  text-align: center;
  font-size: 12px;
  vertical-align: middle
}

.weui-badge_dot {
  padding: .4em;
  min-width: 0
}

.weui-loadmore {
  width: 65%;
  margin: 1.5em auto;
  line-height: 1.6em;
  font-size: 14px;
  text-align: center
}

.weui-loadmore__tips {
  display: inline-block;
  vertical-align: middle
}

.weui-loadmore_line {
  border-top: 1px solid #e5e5e5;
  margin-top: 2.4em
}

.weui-loadmore__tips_in-line {
  position: relative;
  top: -.9em;
  padding: 0 .55em;
  background-color: #fff;
  color: #999
}

.weui-loadmore__tips_in-dot {
  position: relative;
  padding: 0 .16em;
  width: 4px;
  height: 1.6em
}

.weui-loadmore__tips_in-dot:before {
  content: " ";
  position: absolute;
  top: 50%;
  left: 50%;
  margin-top: -1px;
  margin-left: -2px;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background-color: #e5e5e5
}

.weui-panel {
  background-color: #fff;
  margin-top: 10px;
  position: relative;
  overflow: hidden
}

.weui-panel:first-child {
  margin-top: 0
}

.weui-panel:before {
  top: 0;
  border-top: 1rpx solid #e5e5e5
}

.weui-panel:after,
.weui-panel:before {
  content: " ";
  position: absolute;
  left: 0;
  right: 0;
  height: 1px;
  color: #e5e5e5
}

.weui-panel:after {
  bottom: 0;
  border-bottom: 1rpx solid #e5e5e5
}

.weui-panel__hd {
  padding: 14px 15px 10px;
  color: #999;
  font-size: 13px;
  position: relative
}

.weui-panel__hd:after {
  content: " ";
  position: absolute;
  left: 0;
  bottom: 0;
  right: 0;
  height: 1px;
  border-bottom: 1rpx solid #e5e5e5;
  color: #e5e5e5;
  left: 15px
}

.weui-media-box {
  padding: 15px;
  position: relative
}

.weui-media-box:before {
  content: " ";
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  height: 1px;
  border-top: 1rpx solid #e5e5e5;
  color: #e5e5e5;
  left: 15px
}

.weui-media-box:first-child:before {
  display: none
}

.weui-media-box__title {
  font-weight: 400;
  font-size: 17px;
  width: auto;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  word-wrap: normal;
  word-wrap: break-word;
  word-break: break-all
}

.weui-media-box__desc {
  color: #999;
  font-size: 13px;
  line-height: 1.2;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2
}

.weui-media-box__info {
  margin-top: 15px;
  padding-bottom: 5px;
  font-size: 13px;
  color: #cecece;
  line-height: 1em;
  list-style: none;
  overflow: hidden
}

.weui-media-box__info__meta {
  float: left;
  padding-right: 1em
}

.weui-media-box__info__meta_extra {
  padding-left: 1em;
  border-left: 1px solid #cecece
}

.weui-media-box__title_in-text {
  margin-bottom: 8px
}

.weui-media-box_appmsg {
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
  align-items: center
}

.weui-media-box__thumb {
  width: 100%;
  height: 100%;
  vertical-align: top
}

.weui-media-box__hd_in-appmsg {
  margin-right: .8em;
  width: 60px;
  height: 60px;
  line-height: 60px;
  text-align: center
}

.weui-media-box__bd_in-appmsg {
  -webkit-box-flex: 1;
  -webkit-flex: 1;
  flex: 1;
  min-width: 0
}

.weui-media-box_small-appmsg {
  padding: 0
}

.weui-cells_in-small-appmsg {
  margin-top: 0
}

.weui-cells_in-small-appmsg:before {
  display: none
}

.weui-progress {
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
  align-items: center
}

.weui-progress__bar {
  -webkit-box-flex: 1;
  -webkit-flex: 1;
  flex: 1
}

.weui-progress__opr {
  margin-left: 15px;
  font-size: 0
}

.weui-navbar {
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  position: absolute;
  z-index: 500;
  top: 0;
  width: 100%;
  border-bottom: 1rpx solid #ccc
}

.weui-navbar__item {
  position: relative;
  display: block;
  -webkit-box-flex: 1;
  -webkit-flex: 1;
  flex: 1;
  padding: 13px 0;
  text-align: center;
  font-size: 0
}

.weui-navbar__item.weui-bar__item_on {
  color: #1aad19
}

.weui-navbar__slider {
  position: absolute;
  content: " ";
  left: 0;
  bottom: 0;
  width: 6em;
  height: 3px;
  background-color: #1aad19;
  -webkit-transition: -webkit-transform .3s;
  transition: -webkit-transform .3s;
  transition: transform .3s;
  transition: transform .3s, -webkit-transform .3s
}

.weui-navbar__title {
  display: inline-block;
  font-size: 15px;
  max-width: 8em;
  width: auto;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  word-wrap: normal
}

.weui-tab {
  position: relative;
  height: 100%
}

.weui-tab__panel {
  box-sizing: border-box;
  height: 100%;
  padding-top: 50px;
  overflow: auto;
  -webkit-overflow-scrolling: touch
}

.weui-search-bar {
  position: relative;
  padding: 8px 10px;
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  box-sizing: border-box;
  background-color: #efeff4;
  border-top: 1rpx solid #d7d6dc;
  border-bottom: 1rpx solid #d7d6dc
}

.weui-icon-search {
  margin-right: 8px;
  font-size: inherit
}

.weui-icon-search_in-box {
  position: absolute;
  left: 10px;
  top: 7px
}

.weui-search-bar__text {
  display: inline-block;
  font-size: 14px;
  vertical-align: middle
}

.weui-search-bar__form {
  position: relative;
  -webkit-box-flex: 1;
  -webkit-flex: auto;
  flex: auto;
  border-radius: 5px;
  background: #fff;
  border: 1rpx solid #e6e6ea
}

.weui-search-bar__box {
  position: relative;
  padding-left: 30px;
  padding-right: 30px;
  width: 100%;
  box-sizing: border-box;
  z-index: 1
}

.weui-search-bar__input {
  height: 28px;
  line-height: 28px;
  font-size: 14px
}

.weui-icon-clear {
  position: absolute;
  top: 0;
  right: 0;
  padding: 7px 8px;
  font-size: 0
}

.weui-search-bar__label {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 2;
  border-radius: 3px;
  text-align: center;
  color: #9b9b9b;
  background: #fff;
  line-height: 28px
}

.weui-search-bar__cancel-btn {
  margin-left: 10px;
  line-height: 28px;
  color: #09bb07;
  white-space: nowrap
}
app.wxss整体代码

 

  (7)查看“图片”子页面的有哪些内容,效果如下:
  Django+小程序实现图片上传功能

 

 三、通过以上所写的Django和小程序来实现图片上传功能,简单来说就是小程序来实现图片上传,所上传的图片存到Django中,最终如下:

注:Django必须运行起来,才看可以看到小程序上传的图片,如果没有运行起来的话,小程序就会报错

  (1)先在小程序中实现图片上传,如下:
  Django+小程序实现图片上传功能

 

   只要上传成功后,小程序会是以下的效果,如下:
  Django+小程序实现图片上传功能

 

   (2)之后再看Django中的效果,如下:
  Django+小程序实现图片上传功能

 

   Django+小程序实现图片上传功能

 

补充:

如果出现以下的状态,解决方法:点击设置——》项目设置——》请勾上“不校验合法域名、web-view(业务域名)、TLS版本以及HTTPS证书”即可

 Django+小程序实现图片上传功能

 

提供一些关于小程序常用的功能,可以在里面进行下载:

https://github.com/Tencent/weui-wxss

上一篇:微信小程序图片上传


下一篇:java – Android为什么Fragments不应该直接相互通信?