Django后台获取不到前端axios - post请求参数的解决方法

本文介绍了在Vue项目中使用axios发送POST请求时遇到的问题及解决方案。通过修改util.js文件中的ajax请求方式,添加transformRequest字段来正确传递POST参数。

摘自博客 Vue:axios中POST请求传参问题

查看后台获取的请求POST时,是可以看到请求参数的,所以不是通讯问题,肯定是两边处理信息功能不对称;使用的是vue-admin开源后台,在这里记录一下在libs/util.js中关于ajax请求的全局修改:

在 util.ajax = ....下加入:

util.apiAxios = function(url, params, response) {
    this.ajax({
        method: 'POST',
        url: url,
        data: params,
        params: params,
        transformRequest: [function (data) {
            let ret = ''
            for (let it in data) {
                ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
            }
            return ret
        }],
        headers:{'Content-Type': "application/x-www-form-urlencoded"}
    }).then(function (res) {
        response(res);
    }).catch(function (err) {
        response(err);
    })
}

这个方法是直接进行POST请求,如果要改为GET,还需加上请求参数“method”;

出现无法获取参数的解决方法就是添加 transformRequest 字段;

<think>我们正在处理一个前后端分离的场景:前端使用Vue.js和axios发送HTTP POST请求后端使用Django。 用户需求:在Django中验证axios.post提交的账号密码,验证成功后返回其他页面(即重定向或返回一个新的页面)。 但是注意:在前后端分离的架构中,后端通常不直接返回HTML页面,而是返回JSON数据,由前端根据响应进行页面跳转(路由切换)。 根据引用内容: 1. 前端使用axios发送表单数据(账号密码)到Django后端(引用[1][2][4])。 2. 后端使用Django的`authenticate`函数验证用户(引用[3])。 3. 后端验证成功后,使用session记录登录状态(引用[1]),或者返回一个JSON响应(引用[5]),其中包含跳转信息。 然而,用户要求的是“返回其他页面”,在传统多页面应用中,后端可以直接返回重定向响应(302)或者渲染一个新页面。但在前后端分离中,通常有两种做法: - 后端返回重定向的URL,前端通过`window.location`或Vue Router进行跳转。 - 后端返回一个包含跳转URL的JSON响应,前端根据响应跳转。 根据引用[5]中的后台代码示例,它返回的是JsonResponse,并没有直接返回HTML页面。所以,我们这里采用返回JSON数据指示前端跳转。 步骤: 1. 前端通过axios.post发送登录请求(包含用户名和密码)。 2. 后端Django视图接收POST数据,验证用户。 3. 如果验证成功: a. 使用session记录登录状态(可选,用于后续请求的认证) b. 返回JSON响应,包含跳转的URL(例如:{'code':200, 'msg':'登录成功', 'redirect_url': '/dashboard/'}) 4. 如果验证失败,返回错误信息(如:{'code':400, 'msg':'账号或密码错误'})。 5. 前端根据响应,如果成功,则使用Vue Router(this.$router.push)或者window.location.href进行跳转。 注意:由于前后端分离,Django不应该返回重定向的HTML页面,而是返回一个URL让前端跳转。 下面我们分别给出前端后端的代码示例: 后端Django视图(基于引用[5]修改): - 使用Django的认证系统进行用户验证(引用[3])。 - 使用session记录登录状态。 前端Vue方法(使用axios): - 提交表单数据,处理响应。 另外,引用[4]中提到了在axios请求头中添加Authorization和token,但我们这里使用session认证,所以暂时不需要。如果需要使用token认证,则后端应返回token,前端保存并后续携带。 然而,用户要求使用session认证(引用[1]),所以我们使用session。 后端代码示例(Django视图): - 使用`authenticate`验证用户,然后`login`函数设置session。 前端代码示例(Vue组件): - 使用axios发送POST请求,处理响应,跳转。 具体实现如下: </think>### Django 验证 Axios.post 提交的账号密码并返回其他页面的解决方案 根据您的需求,以下是完整的实现方案(前后端协作流程): #### 1. 后端 Django 实现 ```python # views.py from django.http import JsonResponse from django.contrib.auth import authenticate, login from django.views import View import json class LoginView(View): def post(self, request): # 解析 Axios 提交的 JSON 数据 data = json.loads(request.body.decode('utf-8')) username = data.get('username') password = data.get('password') # 用户认证(引用[3]) user = authenticate(username=username, password=password) if user is not None: # 创建 session 记录登录状态(引用[1]) login(request, user) # 返回跳转指令和重定向 URL return JsonResponse({ 'code': 200, 'msg': '登录成功', 'redirect_url': '/dashboard/' # 目标页面路径 }) else: return JsonResponse({ 'code': 403, 'msg': '账号或密码错误' }) ``` #### 2. 前端 Vue + Axios 实现 ```javascript // 在登录组件中 import api from '@/api' // 引用[4]封装的axios实例 export default { methods: { submitLogin() { api.post('/login/', { username: this.username, password: this.password }).then(response => { if (response.data.code === 200) { // 执行页面跳转(引用[2]) window.location.href = response.data.redirect_url; // 若使用 Vue Router // this.$router.push(response.data.redirect_url); } else { alert(response.data.msg); } }).catch(error => { console.error('请求失败:', error); }); } } } ``` #### 3. Django URL 配置 ```python # urls.py from django.urls import path from .views import LoginView urlpatterns = [ path('login/', LoginView.as_view(), name='login'), ] ``` #### 关键实现说明: 1. **认证流程** - 前端通过 Axios 发送 JSON 格式的凭证 - 后端使用 `authenticate()` 验证(引用[3]) - 验证成功后建立 session(引用[1]) 2. **页面跳转机制** - 后端返回 JSON 包含 `redirect_url` - 前端通过 `window.location.href` 或 Vue Router 跳转 - 避免使用 Django 的重定向(前后端分离架构要求) 3. **安全增强建议**: - 启用 CSRF 保护:在 Axios 请求头添加 `X-CSRFToken` - 使用 HTTPS 传输敏感数据 - 添加登录失败次数限制 #### 配置注意事项: 1. 确保 Django 的 `settings.py` 包含: ```python INSTALLED_APPS = [ # ... 'django.contrib.sessions', 'django.contrib.auth' ] MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware' ] ``` 2. 若使用 Vue Router 跳转,需提前配置路由: ```javascript // router.js const routes = [ { path: '/dashboard', component: DashboardComponent } ] ``` 此方案实现了: - 安全的用户凭证验证(基于 Django 原生认证系统) -后端分离架构的正确跳转模式 - 可扩展的 JSON 交互协议 - Session 状态管理的最佳实践 如需实现 JWT 验证替代 session,可增加 token 返回机制(引用[4]),但需注意 token 刷新策略。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值