web开发Django+vue3

返回验证码图片

后端:返回Http对象,content_type设置为image

# 验证码测试视图函数
def get_captcha(request):img, code = generate_captcha()  # 生成验证码request.session['captcha_code'] = code  # 将验证码保存到session中buf = BytesIO()  # 创建一个BytesIO对象,用于存储验证码图片img.save(buf, 'png')  # 将验证码图片保存到BytesIO对象中return HttpResponse(buf.getvalue(),content_type="image/png")  # 返回验证码图片的二进制数据

前端:设置imageUrl变量,img自动访问资源

<img :src="imageUrl" v-on:click=imgSrc(this) alt="验证码图片" style="width: 100px; margin-left: 40px;" />

但是没办法点击刷新验证码

重新绑定函数完成。

@click="imgSrc"const imgSrc = () => {imageUrl.value = imageUrl.value + '?' + new Date().getTime()api.get_session().then((res) => {console.log(res)})
}

前端请求cookie丢失

原文链接:Django+vue 解决cookie跨域不携带问题(本地)以及上线后 - 春游去动物园 - 博客园

1排除了跨域问题,后端已经解决了跨域

后端通过

pip install django-cors-headerssessting.py设置SESSION_EXPIRE_AT_BROWSER_CLOSE = True  # 会话cookie可以在用户浏览器中保持有效期。 False---session 在一段时间不活动后过期。True:关闭浏览器,则Cookie失效。
SESSION_COOKIE_SAMESITE = None
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CSRF_COOKIE_SAMESITE = None
CSRF_COOKIE_SECURE = False
CORS_ALLOW_METHODS = ('DELETE','GET','OPTIONS','PATCH','POST','PUT','VIEW',
)CORS_ALLOW_HEADERS = ('XMLHttpRequest','X_FILENAME','accept-encoding','authorization','content-type','dnt','origin','user-agent','x-csrftoken','x-requested-with','Pragma','Cookie',
)

解决了跨域问题

前端通过代理域名,二次封装axios请求完成

vue.config.js

devServer: {  //开启代理服务器proxy:{"/api": {  // /api是自行设置的请求前缀,按照这个来匹配请求,有这个字段的请求,就会走到代理来。target: "http://127.0.0.1:8081", // 需要代理的域名,目标域名,会替换掉匹配字段之前的路径ws: false, // 是否启用websocketschangeOrigin: true, //是否跨域pathRewrite: {  //重写匹配的字段,如果不需要放在请求路径上,可以重写为"""^/api": ""}},}},

request.js

const instance = axios.create({timeout:5000,baseURL:'/api', // 设置通用请求的地址前缀withCredentials : true
})

可以传递cookie。

但是session无法获取,大概猜到原因,依然是跨域问题,在vue的api封装解决了跨域,但是session的设置是根据img的src路径直接访问,依然存在跨域问题,所以重点在于解决前端使用跨域解决获取验证码图片的操作

很难受,没怎么用心学VUE,在前端访问后端接口的时候后端传回图片的二进制数据流,但是前端一直无法显示,cors跨域问题已经解决,明白只要通过二次封装的axios请求就可以通过后端设置session。但是前端一直无法显示,尝试了无数方法,最后发现我的responetype设置到别的接口了,难怪一直没生效

vue3前端将二进制流文件显示

# index.js文件中请求函数   
get_capt() {return axios.get(base.baseUrl + base.captcha ,{responseType: 'blob'})},//使用的时候
// 生成验证码图片
const imgSrc = () => {api.get_capt().then((res) => {console.log(res)const blob = new Blob([res.data]);let url = window.URL.createObjectURL(blob); //根据返回的流文件创建url;url指向流imageUrl.value = url; // 创建一个指向 blob 对象的 URLconsole.log(imageUrl.value)})
}


登录设置cookie状态

前端访问登录页面,登录后,后端向前端设置cookie。

前端直接访问主页面,后端通过cookie判断时候存在登录状态的cookie,如果没有就返回信息,让前端跳转到登录页面。如果有的话就根据cookie返回登录的用户信息


菜单部分设置采用后端传递前端的方式

数据库设计t_meau表中设计为自关联表,通过后端序列化后进行返回给前端,前端读取页面并显示

自关联序列化序列化,没招数了,多表关联都能用,自关联只能学着写了。自己摸索的

class Children2MeausSerializer(serializers.ModelSerializer):class Meta:model = meausfields = ['id', 'name', 'level', 'path']class ChildrenMeausSerializer(serializers.ModelSerializer):children = Children2MeausSerializer(many=True, read_only=True)class Meta:model = meausfields = ['id', 'name', 'level', 'path', 'children']class MeausSerializer(serializers.ModelSerializer):# 通过related_name='children'指定子级数据的反向查询字段名为childrenchildren = ChildrenMeausSerializer(many=True, read_only=True)class Meta:model = meausfields = ['id', 'name', 'level', 'path', 'children']

上传用户头像并更改

通过el-upload,先判断传递图片是否符合要求,之后对传递的图片进行处理,并且保存为全局变量(需要对整个用户信息进行更新)获取到了图片信息之后通过请求后端接口将用户图像的图片信息传递过去。从后端拿到图片的地址在返回给前端。后端通过接收到图片的信息后将图片的上传到七牛云中进行云端储存,并且将储存的云端地址保存到mysql数据库当中。后端返回的时候将数据库的地址返回给前端,前端接收到数据地址进行赋值给表单或者弹窗中的图片地址,从而显示出图片

vue3的全局变量使用

// main.vue
const { proxy } = getCurrentInstance()
let user_img= proxy.$user_img// main.js
const app = createApp(App)app.config.globalProperties.$user_img = '用户的头像地址';app.use(router).provide("$axios",axios).mount('#app')

重新捋一下

用户选择好图片之后,点击上传,发送上传请求给后端。后端接收到上传的文件流,将文件流发送到七牛云平台进行保存,返回一个图片的链接地址。后端将接收到的链接地址保存更新数据库并返回给前端页面进行展示。直接更改前端的src路径。

卡了我一天时间

解决方式:

通过element-plus的el-upload组件进行上传头像,起初认为action自动发送的请求会出现跨域问题,所以一直想要更新源码进行发送请求,最后实践得知不会出现跨域问题,因为我的后端需要cookie进行身份辨别,所以添加了:with-credentials="true"

<el-dialog class="avatarDialog" :showClose="false" center v-model="avatarDialogVisible" title="更新头像"><el-upload ref="upload"class="avatar-uploader" :show-file-list="false" action='http://localhost:8081/user/upload_img/':with-credentials="true"   :on-success="handleAvatarSuccess":before-upload="beforeAvatarUpload"    :auto-upload = 'true'><img v-if="imageUrl" :src="imageUrl" class="avatar" /><el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon></el-upload><template #footer><span class="dialog-footer"><el-button @click="file_out">关闭</el-button></span></template></el-dialog>

后端就可以接收到前端发送的请求

@csrf_exempt
def upload_img(request):if request.method == 'POST':try:user_id = request.COOKIES.get('user_id')user = Users.objects.get(pk=user_id)except KeyError:return JsonResponse({"data":False,"msg":"登录过期,请重新登录"}, status=200)# json_data = json.loads(request.body)user_img = request.FILES['file'].file  # 获取用户上传的头像图片文件流file_name = upload_file(settings.AK, settings.SK, user_img)user.img = f'{settings.BUCKET_URL}/{file_name}'user.save()  # 将头像地址保存到数据库中print(f'文件地址:{settings.BUCKET_URL}/{file_name}')return JsonResponse({'data':'调用了接口',"user_img":user.img},status=200)

通过封装好的upload_file函数,将文件流上传到七牛云保存,并返回相应的地址,将地址更新到数据库当中,减少了数据库的储存量,返回给前端图片的路径地址。在通过scr属性进行显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/465036.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6-解决Ubuntu系统与Windows系统双系统时间不同步问题

引言 &#xff1a; 你是不是每次切换系统之后&#xff0c;系统时间就混乱了&#xff1f;想设置一致但又无从下手。看完这篇文章&#xff0c;你就全懂了&#xff01;&#xff01; 学习目标&#xff1a; 帮助开发者理解并解决 Ubuntu 与 Windows 双系统中时间不同步的问题。通…

【大数据学习 | kafka】kafka的偏移量管理

1. 偏移量的概念 消费者在消费数据的时候需要将消费的记录存储到一个位置&#xff0c;防止因为消费者程序宕机而引起断点消费数据丢失问题&#xff0c;下一次可以按照相应的位置从kafka中找寻数据&#xff0c;这个消费位置记录称之为偏移量offset。 kafka0.9以前版本将偏移量信…

基于梯度的快速准确头部运动补偿方法在锥束CT中的应用|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 A gradient-based approach to fast and accurate head motion compensation in cone-beam CT 基于梯度的快速准确头部运动补偿方法在锥束CT中的应用 01 文献速递介绍 锥束计算机断层扫描&#xff08;CBCT&#xff09;系统在灵活性方面比螺旋多排探测器计算机断…

语音识别ic赋能烤箱,离线对话操控,引领智能厨房新体验

一、智能烤箱产品的行业背景 随着科技的飞速发展&#xff0c;智能家居已经成为现代家庭的新宠。智能烤箱作为智能家居的重要组成部分&#xff0c;正逐渐从高端市场走向普通家庭。消费者对于烤箱的需求不再仅仅局限于基本的烘焙功能&#xff0c;而是更加注重其智能化、便捷化和…

qt QWizard详解

1、概述 QWizard是Qt框架中提供的一个功能强大的向导对话框类。它帮助用户逐步完成复杂的任务或流程&#xff0c;通过一系列页面组成的向导界面&#xff0c;实现了交互式和响应式的用户体验。QWizard可以应用于多种场景&#xff0c;如安装向导、配置向导、数据导入向导等&…

如何看待AI技术的应用场景:现状与未来的全面解析

人工智能&#xff08;AI&#xff09;正在以惊人的速度改变我们的世界。从医疗诊断到自动驾驶&#xff0c;从虚拟助手到金融分析&#xff0c;AI的应用场景正日益扩展&#xff0c;影响着几乎每个行业。然而&#xff0c;AI的广泛应用也引发了关于隐私、安全、伦理等多方面的讨论。…

ONLYOFFICE 8.2深度体验:高效协作与卓越性能的完美融合

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ONLYOFFICE 8.2 &#x1f50d;引言&#x1f4d2;1. ONLYOFFICE 产品简介&#x1f4da;2. 功能与特点&#x1f341;协作编辑 PDF&#x1f342;…

使用SQLark如何将Oracle迁移到达梦数据库

​ 以上对话源于某位负责数据库适配的 ISV 工程师&#xff0c;他正在将数据从 Oracle 迁移到某国产数据库中。像这样的基础问题&#xff0c;每天在各个适配群、各个社区不断出现&#xff0c;比如&#xff1a; Oracle 迁移到 DM 后&#xff0c;数据有乱码&#xff0c;达梦如何设…

Unity3D学习FPS游戏(9)武器音效添加、创建敌人模型和血条

前言&#xff1a;虽然已经实现了基本玩家操作&#xff0c;但是游戏运行起来并没有音效。既然是FPS游戏有了玩家和武器&#xff0c;肯定还得有敌人。本篇演示如何给武器添加音效和创建敌人。 武器音效添加和创建敌人 武器音效添加Audio Source代码控制 创建敌人目标敌人模型敌人…

【算法】Floyd多源最短路径算法

目录 一、概念 二、思路 三、代码 一、概念 在前面的学习中&#xff0c;我们已经接触了Dijkstra、Bellman-Ford等单源最短路径算法。但首先我们要知道何为单源最短路径&#xff0c;何为多源最短路径 单源最短路径&#xff1a;从图中选取一点&#xff0c;求这个点到图中其他…

Docker安装MongoDB详解(mongo.latest)

一、MongoDB介绍 MongoDB是一种基于分布式文件存储的数据库&#xff0c;使用C语言开发&#xff0c;旨在为Web应用提供可扩展且高性能的数据存储解决方案。作为一种介于关系数据库和非关系数据库之间的技术&#xff0c;MongoDB具有强大的功能和高效的性能&#xff0c;特别适用于…

金箍棒变化-第15届蓝桥杯国赛Scratch初/中级组真题第1题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第193讲。 如果想持续关注Scratch蓝桥真题解读&#xff0c;可以点击《Scratch蓝桥杯历年真题》并订阅合集&#xff0c;…

简单的 docker 部署ELK

简单的 docker 部署ELK 这是我的运维同事部署ELK的文档&#xff0c;我这里记录转载一下 服务规划 架构: Filebeat->kafka->logstash->ES kafka集群部署参照: kafka集群部署 部署服务程序路径/数据目录端口配置文件elasticsearch/data/elasticsearch9200/data/elas…

Unity XR Interaction Toolkit 开发教程(3)快速配置交互:移动、抓取、UI交互【3.0以上版本】

获取完整课程以及答疑&#xff0c;工程文件下载&#xff1a; https://www.spatialxr.tech/ 视频试看链接&#xff1a; 3.快速配置交互&#xff1a;移动、抓取、UI交互【Unity XR Interaction Toolkit 跨平台开发教程】&#xff08;3.0以上版本&#xff09; 系列教程专栏&…

深度体验SCNet超算平台:SCNet「AI跃升季」·谁是下一个“AI”跃人?

平时做大模型训练的时候总是苦于没有服务器资源来做微调实验&#xff0c;于是这次深度体验了一下SCNet超算平台。 SCNet超算平台是一个超算互联网计算服务平台&#xff0c;有着更大更全更专业的超级算力。显卡从异构加速卡到A800都有。 本次我尝试了大模型的推理和微调。 第一…

求助帖【如何学习核磁共振的原理】

最近提前进组了 我完全不懂磁共振的相关知识 想问问各位大佬有没有推荐的学习路线 或者是学习资料、论坛都可以的&#xff08;我做的方向是磁共振成像技术&#xff09; 老师给了一本书&#xff0c;但是有点看不懂&#xff0c;全英文的 叫Principles Of Magnetic Resonance …

MySQL查询where中包含多个in条件问题

示例&#xff1a; select * from x_table where a in (1,2,3) and b in (4,8) 上面这种查询方法&#xff0c;如果可以通过a和b唯一确定一条数据&#xff0c;但a和b列可以有相同值时&#xff0c;会造成查询数据不准确。 验证&#xff1a; 假设有以下数据&#xff08;手机号为…

HiveSQL 中判断字段是否包含某个值的方法

HiveSQL 中判断字段是否包含某个值的方法 在 HiveSQL 中&#xff0c;有时我们需要判断一个字段是否包含某个特定的值。下面将介绍几种常用的方法来实现这个功能。 一、创建示例表并插入数据 首先&#xff0c;我们创建一个名为employee的表&#xff0c;并插入一些示例数据&am…

python-读写Excel:openpyxl-(4)下拉选项设置

使用openpyxl库的DataValidation对象方法可添加下拉选择列表。 DataValidation参数说明&#xff1a; type&#xff1a; 数据类型("whole", "decimal", "list", "date", "time", "textLength", "custom"…

求平面连接线段组成的所有最小闭合区间

这个功能确实非常实用&#xff0c;我在过去开发地面分区编辑器时就曾应用过这一算法。最近&#xff0c;在新产品的开发中再次遇到了类似的需求。尽管之前已经实现过&#xff0c;但由于长时间未接触&#xff0c;对算法的具体细节有所遗忘&#xff0c;导致重新编写时耗费了不少时…