登陆

python - <flask web>的flasky项目的头像问题

怎么换成自定义的本地头像呢? 有没有实现的代码 给个链接看看 谢谢

本地的图片地址:./static/avatar/1.jpg-9.jpg

我的代码是这样的:

def gravatar(self, size=100, default='identicon', rating='g'):
    import random
    return '%d.jpg' % random.randint(1, 9)
    

调用是这样的:
<img class="img-rounded profile-thumbnail" src="{{ url_for('static', filename='avatar/') }}{{ current_user.avatar_hash }}">

我这样修改后 图片是加载不出来的 为什么呢?

# Python
某草草某草草1596 天前458 次浏览

全部回复(1)我要回复

  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-06-12 09:24:28

    欢迎交流, 也在学 Flask, 不过我没用书上 gavatar 的例子, 所以我也不太知道你的问题出在哪里...

    关于本地头像, 我这边有个自己写的半成品供参考, 实现了 ajax 异步上传头像到服务器. User 模型里添加了一个 avatar 字段, 存放头像路由相应的 url 路径, 通过访问头像路由得到头像文件. 上传的头像根据用户 idAVATARS_PER_FOLDER 个头像文件存放在 /static/img/avatr/n/ 中, 文件名是 u{id}.jpg.

    时间关系我解释的不太详细, 欢迎交流~


    backend 蓝图 - app/backend/views.py:

    处理头像上传和返回头像

    @backend.route("/avatar/<int:id>", methods=["GET", "POST"])
    def avatar(id):
        # 设置头像存储路径
        avatar_folder = current_app.config["UPLOAD_FOLDER"] + "avatar/"
        # 按照 id 计算头像存储位置
        r = id // current_app.config["AVATARS_PER_FOLDER"]
        save_location = avatar_folder + str(r)
        # jpg
        filename = "u{}.jpg".format(id)
    
        # 处理头像上传
        # TODO: CSRF 保护
        if request.method == "POST" and request.is_xhr:
            # base64 -> img
            img_b64 = request.form.get("img")
            img_b64 = re.sub(r"data:image/.+;base64,", "", img_b64)
            img = Image.open(BytesIO(base64.b64decode(img_b64)))
            # 保存文件
            if not os.path.exists(save_location):
                os.mkdir(save_location)
            img.save(os.path.join(save_location, filename))
            # 更新数据库
            u = User.query.get_or_404(id)
            u.avatar = url_for("backend.avatar", id=id)
            db.session.add(u)
            # 返回响应
            return jsonify(result="success")
    
    return send_from_directory(save_location, filename)

    html 页面 - app/templates/user_settings.html:

    通过 ajax 处理头像上传和更新显示

    <p class="settings_avatar">
        <a class="avatar" href="#">
            <img alt="头像" class="img-circle" src="{{ current_user.avatar }}">
        </a>
        <input id="upload_avatar" type="file" accept="image/*">
    </p>

    这里使用 localResizeIMG 插件来压缩图像, 得到图像的 base64 编码, 传入 upload_avatar() 函数异步上传, 如果上传成功, 更新头像显示

    <script>
        $(function() {
            var URL_ROOT = {{ request.url_root | tojson | safe }};
            var id = {{ current_user.id }}
        
            $("#upload_avatar").on("change", function() {
                // 使用了
                lrz(this.files[0])
                .then(function (rst)
                    upload_avatar(URL_ROOT, id, rst);
                })
                .catch(function (err) {
                    alert(err);
                })
                .always(function () {});
            })
        })
        function upload_avatar(URL_ROOT, id, rst) {
            r = "backend/avatar/" + id;
            $.post(
                URL_ROOT+r,
                {
                    img: rst.base64,
                },
                function(data) {
                    if (data.result === "success") {
                        $(".settings_avatar .avatar .img-circle").attr("src", rst.base64);
                    }
                }
            )
        }
    </script>

    回复
    0
  • 取消回复发送