微信公众号开发Django-图片处理

本文介绍了一种利用weui.js简化微信公众号图片上传流程的方法。文章详细解释了前后端交互过程,包括如何设置后端接收前端POST请求及前端weui.js的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信公众号开发,图片处理部分

上篇文章已经获取了wx的接口权限
本来想直接使用wx的图像接口,但是后来发现处理js动作有点小麻烦
还有些莫名的错误,就选择了好用的weui.js
挺好用~

(为了少走弯路,建议直接用weui.js)

首先我们设置后端代码接收前端post,在上篇文章已经提到

# Image字段
class Image(models.Model):
    file = models.ImageField('图片', upload_to=image_filename, blank=True)
    name = models.CharField('文件名', blank=True, null=True, max_length=256)
    uploaded_by = models.ForeignKey(FansProfile, verbose_name='上传者', on_delete=models.CASCADE)

    created_time = models.DateTimeField('创建时间', auto_now_add=True)
    last_modify_time = models.DateTimeField('最后修改时间', auto_now=True)

class activity(View):
    
    def post(self,request,*args, **kwargs):
        request_type = request.POST.get('type')
        if not request_type:
            pass # 处理ticket获取
        elif request_type == 'image/jpeg':
            files = request.FILES.getlist('fileVal')[0]
            filename = request.POST.dict()['name']
            uploader_id = request.COOKIES.get('fanid','')
            check_id = FansProfile.objects.filter(id=uploader_id).first()
            if not check_id:
                return HttpResponseRedirect(web_get_code+'snsapi_base#wechat_redirect')
            post_image = Image(file = files) # Image数据库模型
            post_image.uploaded_by = check_id
            post_image.name = filename.split('.')[:-1][0]
            post_image.save()
            return HttpResponse(json.dumps({'statue':True}),content_type="application/json")

然后来到前端,下面是简单的实现
就是weui.js文档和演示html的堆砌
详情点击weui.js-docs
weui.js预览

{% load static %}
<script>
    $(document).ready(function () {
        var uploadCountDom = document.getElementById("uploadCount")
        var url = location.href.split('#')[0];
        var uploadCount = 0,
            uploadList = [];
        $('#uploaderInput').on("click", function (e) {
                weui.uploader('#uploader', {
                    url: url,
                    auto: false,
                    type: 'file',
                    fileVal: 'fileVal',
                    compress: {
                        width: 1600,
                        height: 1600,
                        quality: .8
                    },
                    onBeforeQueued: function (files) {
                        // `this` 是轮询到的文件, `files` 是所有文件

                        if (["image/jpg", "image/jpeg", "image/png", "image/gif"].indexOf(this.type) < 0) {
                            weui.alert('请上传图片');
                            return false; // 阻止文件添加
                        }
                        if (this.size > 10 * 1024 * 1024) {
                            weui.alert('请上传不超过10M的图片');
                            return false;
                        }
                        if (files.length > 5) { // 防止一下子选择过多文件
                            weui.alert('最多只能上传5张图片,请重新选择');
                            return false;
                        }
                        if (uploadCount + 1 > 5) {
                            weui.alert('最多只能上传5张图片');
                            return false;
                        }

                        ++uploadCount;
                        uploadCountDom.innerHTML = uploadCount
                        // return true; // 阻止默认行为,不插入预览图的框架
                    },
                    onQueued: function () {
                        uploadList.push(this);
                        console.log(this);

                        // console.log(this.status); // 文件的状态:'ready', 'progress', 'success', 'fail'
                        // console.log(this.base64); // 如果是base64上传,file.base64可以获得文件的base64

                        // this.upload(); // 如果是手动上传,这里可以通过调用upload来实现;也可以用它来实现重传。
                        // this.stop(); // 中断上传

                        // return true; // 阻止默认行为,不显示预览图的图像
                    },
                    onBeforeSend: function (data, headers) {
                        console.log(this, data, headers);
                        // $.extend(data, { test: 1 }); // 可以扩展此对象来控制上传参数
                        $.extend(headers, { 'X-CSRFToken': '{{ csrf_token }}' }); // 可以扩展此对象来控制上传头部

                        // return false; // 阻止文件上传
                    },
                    onProgress: function (procent) {
                        console.log(this, procent);
                        // return true; // 阻止默认行为,不使用默认的进度显示
                    },
                    onSuccess: function (ret) {
                        console.log(this, ret);
                        // return true; // 阻止默认行为,不使用默认的成功态
                    },
                    onError: function (err) {
                        console.log(this, err);
                        // return true; // 阻止默认行为,不使用默认的失败态
                    }
                });
        })
        // 缩略图预览
        document.querySelector('#uploaderFiles').addEventListener('click', function (e) {
            var target = e.target;

            while (!target.classList.contains('weui-uploader__file') && target) {
                target = target.parentNode;
            }
            if (!target) return;

            var url = target.getAttribute('style') || '';
            var id = target.getAttribute('data-id');

            if (url) {
                url = url.match(/url\((.*?)\)/)[1].replace(/"/g, '');
            }
            var gallery = weui.gallery(url, {
                className: 'custom-name',
                onDelete: function onDelete() {
                    weui.confirm('确定删除该图片?', function () {
                        --uploadCount;
                        uploadCountDom.innerHTML = uploadCount;

                        for (var i = 0, len = uploadList.length; i < len; ++i) {
                            var file = uploadList[i];
                            if (file.id == id) {
                                file.stop();
                                break;
                            }
                        }
                        target.remove();
                        gallery.hide();
                    });
                }
            });
        });
        document.querySelector('#images-del').addEventListener('click', function () {
            options.onDelete.call(this, url);
        });
        document.querySelector('#confirmBtn').addEventListener('click', function () {
            weui.confirm('确定提交吗?', function () {
                uploadList.forEach(function (file) {
                    file.upload();
                });
                console.log('yes');
            }, function () {
                console.log('no');
            }, {
                    title: '提交确认'
                });
        });
    });
</script>

<div class="weui-gallery">
    <span class="weui-gallery__img"></span>
    <div class="weui-gallery__opr">
        <a href="javascript:" class="weui-gallery__del">
            <i class="weui-icon-delete weui-icon_gallery-delete" id="images-del"></i>
        </a>
    </div>
</div>
<div class="weui-cells weui-cells_form" id="uploader">
    <div class="weui-cell">
        <div class="weui-cell__bd">
            <div class="weui-uploader">
                <div class="weui-uploader__hd">
                    <p class="weui-uploader__title">图片上传</p>
                    <div class="weui-uploader__info">
                        <span id="uploadCount">0</span>/5</div>
                </div>
                <div class="weui-uploader__bd">
                    <ul class="weui-uploader__files" id="uploaderFiles"></ul>
                    <div class="weui-uploader__input-box">
                        <input id="uploaderInput" class="weui-uploader__input" type="file" accept="image/*" capture="camera" multiple="" />
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<div class="weui-btn-area">
    <a class="weui-btn weui-btn_primary" href="javascript:" id="confirmBtn">确定</a>
</div>

wechat.gif

转载于:https://www.cnblogs.com/bay1/p/10982502.html

### 微信公众号美食列表功能的实现 #### 一、准备工作 为了实现在微信公众号中的美食列表功能,开发者需先获取微信公众平台账号并完成认证。准备好开发环境,安装必要的开发工具如微信开发者工具等[^1]。 #### 二、前端页面设计 采用HTML5、CSS3以及JavaScript来创建响应式的网页布局,用于展示美食条目。可以借鉴微信小程序的设计理念,比如使用卡片式布局显示每道菜的信息,包括名称、描述、价格及图片等内容。对于更复杂的交互需求,则可考虑引入Vue.js或React框架辅助开发[^2]。 #### 三、后端服务搭建 构建服务器端API接口,负责处理来自客户端的数据请求和服务逻辑运算。可以选择Node.js配合Express框架快速搭建RESTful风格的服务;也可以选用Python Flask/Django作为后台支撑。确保能够提供如下几个主要的功能模块: - **菜品管理**:增删改查各类菜肴详情; - **分类检索**:按照不同类别筛选查询特定类型的食品; - **用户互动**:支持访客提交评论留言给商家反馈意见。 ```javascript // Node.js Express 示例代码片段 const express = require('express'); const app = express(); app.get('/api/foods', (req, res) => { const foodsData = [ { id: '001', name: "宫保鸡丁", price: 28 }, { id: '002', name: "鱼香肉丝", price: 26 } ]; res.json(foodsData); }); app.listen(3000, () => console.log('Server running on port 3000')); ``` #### 四、数据存储方案 针对具体应用场景选取合适的关系型数据库(MySQL/PostgreSQL)或是NoSQL解决方案(MongoDB),用来持久化保存菜单项及其关联属性。如果希望进一步降低运维成本和技术门槛的话,还可以尝试腾讯云提供的CloudBase云开发产品线下的Database能力。 #### 五、安全机制设置 考虑到网络传输过程中的信息安全问题,在实际部署过程中应当启用HTTPS协议加密通信链路,并且遵循OAuth2.0授权标准保护用户的隐私权益不受侵犯。同时注意防范XSS跨站脚本攻击和CSRF伪造请求漏洞风险点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值