我正在使用React与后端通信。现在尝试正确实现Formik(表单库)。
主要问题: 如何正确使用Formik的setError方法?
客户端验证错误可以正确显示,但是现在我尝试设置/显示后端验证错误,这些错误将通过状态码400的响应返回。
链接到我尝试使用的方法的文档
我在下面的代码中名为handle400Error的方法中使用此方法。
我的React(和Formik)代码:
import React, { Component } from "react";
import axios from "axios";
import { Formik } from "formik";
import * as Yup from "yup";
import styled from "styled-components";
import FormError from "../formError";
const Label = styled.label``;
class LoginForm extends Component {
initialValues = {
password: "",
username: ""
};
getErrorsFromValidationError = validationError => {
const FIRST_ERROR = 0;
return validationError.inner.reduce((errors, error) => {
return {
...errors,
[error.path]: error.errors[FIRST_ERROR]
};
}, {}); …Run Code Online (Sandbox Code Playgroud) 所以,正如标题所说我使用的是Django Rest Framework,结合了React.
我使用令牌认证对用户进行身份验证 现在我遇到了一个问题.当我重新加载页面时(例如,通过按F5键),所有状态都消失了,在这种情况下我无法保存令牌,要求用户再次登录.
我想过将令牌存放在cookie中,但这似乎不太安全.
还有其他问题,但没有答案真正解释了这有多大的安全风险.我觉得它很高,因为拥有令牌似乎足以作为后端的某人进行身份验证.
所以,我的问题是:我的假设是,将我的身份验证令牌存储在cookie中是不是安全吗?
注意:我正在考虑切换到基于会话的身份验证,但我宁愿保护我的工作并保持令牌身份验证.
虽然在 SO 上有很多关于这个主题(或密切相关)的帖子,但我没有找到我要找的东西。
正如标题所示,我使用 Django Rest Framework 作为后端,使用 React 作为前端。
现在我实现了令牌认证,它完美地工作。唯一的问题是token是保存在React的状态中的,如果用户刷新页面,他就不再登录了(token丢失了)。
所以,现在我想切换到会话身份验证,因为问题解决了。但这需要我做一些研究,在我去那里之前,我想知道这是否是最佳选择。
我的问题:
我是否需要使用会话身份验证来让用户保持登录状态,即使 React 的状态发生变化。或者我也可以通过令牌认证来实现同样的事情(以安全和负责任的方式?)
我想我可以将令牌保存在 cookie 中,但这对我来说似乎并不安全。
编辑:
后来我意识到,为什么不将令牌存储在会话中?
我发现了一种为我的网站创建粘性页脚的非常简单的方法,乍一看,它似乎工作得很好。
但是因为我没有看到其他人使用同样的东西,所以我想知道这种做法是否在根本不支持 flex-box 的浏览器之外被打破了?
我使用 bootstrap 来设置 flex-box,我在 React 中工作,这是我的代码:
<div className="body-div d-flex flex-column justify-content-between">
<div> <!-- inner div -->
<MainNav/>
</div>
<MainFooter className="d-flex flex-column"/>
</div>
Run Code Online (Sandbox Code Playgroud)
对于不知道 react 的人:可以将外部 div 视为“正常”html 页面上的 body 元素。
body-div的css:
min-height: 100vh;
Run Code Online (Sandbox Code Playgroud)
所以基本上我通过将它们的容器设置为 flex-box 并将 justify-content 的属性设置为 space-between 来分别将内部 div 和主页脚推到顶部和底部。
另外我想补充一点,我网站的内容,除了页脚,将进入内部 div。
在带有 Python 3.7.3 pipenv 虚拟环境的 ubuntu 16.04 上使用 VS Code 1.35.1,我试图在 .env 文件中设置环境变量,但由于某种原因,该文件似乎无法识别。
有人可以帮助我了解如何让我的(Django)应用程序访问环境变量,而无需手动运行pipenv shell.
采取的步骤:
所以,这就是我正在做的事情:
1 - 我已经为我的项目设置了 Python 解释器,如下所示:ctrl + shift + p> Python: Select interpreter>Python 3.7.3 64-bit ('environment_name': pipenv)
2 - 在项目根目录中创建一个 .env 文件:
# Django
SECRET_KEY="some key here"
DEBUG=True
...
Run Code Online (Sandbox Code Playgroud)
3 - 确保安装并启用了 VS Code Python 扩展
4 - 调整我的 Django 设置文件以从环境变量中获取 SECRET_KEY:
SECRET_KEY = os.getenv('SECRET_KEY')
5 - 从 VS Code 终端运行 Django 开发服务器(通过 激活 pipenv 环境ctrl + …
使用带有django-rest-auth的Django REST Framework(DRF),我创建了一个带有一个额外字段的自定义用户模型。我的目标是使用django-rest-auth注册端点在一个请求中注册一个新用户,从而发送所有数据以创建一个新用户,包括多余字段的数据。
我正在使用AbstractUser,因为它似乎是推荐给初学者的,在初学者中,更高级的开发人员可以使用AbstractBaseUser。这也是为什么以下SO答案对于我想要实现的目标而言过于复杂的原因:链接此处。
我知道这个问题已经被问过多次了,但是答案并不完全是我想要的。对于像我这样的初学者来说,这是一件复杂的事情。
所以,我的问题是,任何人都可以解释如何实现我想要的吗?
我在用:
Django 2.1.4
django-allauth 0.38.0
django-rest-auth 0.9.3
djangorestframework 3.9.0
Run Code Online (Sandbox Code Playgroud)
这是到目前为止的代码:
使用本教程来获得此代码
settings.py:
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '!gxred^*penrx*qlb=@p)p(vb!&6t78z4n!poz=zj+a0_9#sw1'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = [] …Run Code Online (Sandbox Code Playgroud) django django-rest-framework django-allauth django-rest-auth
我正在尝试使用Visual Studio Code调试自定义管理命令。
为此,我阅读了有关使用Python和Django的官方VS Code教程,并在遵循这些教程的同时设法调试了代码。
VS Code Python教程 / VS Code Django教程
问题在于,对于Python脚本(非Django),调试器有效,因为在文件选项卡打开时我运行了特定文件(通过按f5键)。Django调试之所以有效,是因为VS Code知道何时浏览器请求导致我的Django应用达到我在VS Code中输入的断点。
但是自定义管理命令的运行方式有所不同。为此,我在控制台中键入以下内容:
python manage.py name_of_management_command
如何在VS Code中调试此代码?
我创建了一个模块,在其中我保留了调用api的函数.虽然'要求',但我得到以下错误:
./src/Components/Search/SearchPage.js
Module not found: Can't resolve '../utils/api' in 'C:\Users\riksch\Dropbox\projects\Current\greenmp\frontend\src\Components\Search'
Run Code Online (Sandbox Code Playgroud)
我的主要问题是:如何将api模块正确导入SearchPage.js?
这是我的项目的结构:
我突出显示了我使用的文件,1是我导入(需要)的文件,2是我尝试导入的模块.
这之前有用,但是现在我改变了文件夹结构,即使在调整路径之后,我也无法得到它.
我尝试了不同的导入路径,都有相同的错误.
SearchPage.js需要声明
const api = require('../utils/api')
Run Code Online (Sandbox Code Playgroud)
api.js
var axios = require('axios')
module.exports = {
retrievePlants: function(search_query, locale) {
console.log("api.retrievePlants executes")
console.log("url: " + 'http://127.0.0.1:8000/search/'+locale+'/'+search_query)
//FIXME: hardcoded URL HOST
// return axios.get('https://127.0.0.1/search/'+locale+'/'+search_query)
return axios.get('http://127.0.0.1:8000/search/'+locale+'/'+search_query)
.then(function(response) {
console.log("response.data:")
console.log(response.data)
return response.data
})
.catch(function(error) {
console.log("Error in Components.utils.api.retrievePlants:")
console.log(error)
console.log("console.log(error.response.data):")
console.log(error.response.data)
})
},
}
Run Code Online (Sandbox Code Playgroud) django ×5
reactjs ×3
javascript ×2
cookies ×1
css ×1
debugging ×1
flexbox ×1
formik ×1
html ×1
importerror ×1
pipenv ×1
python ×1
react-native ×1
require ×1
security ×1