我有一个react/redux应用程序从api服务器获取令牌.在用户进行身份验证之后,我想让所有axios请求都将该令牌作为Authorization标头,而不必手动将其附加到操作中的每个请求.我是新手反应/ redux并不确定最好的方法,并没有在谷歌上找到任何质量点击.
这是我的redux设置:
// actions.js
import axios from 'axios';
export function loginUser(props) {
const url = `https://api.mydomain.com/login/`;
const { email, password } = props;
const request = axios.post(url, { email, password });
return {
type: LOGIN_USER,
payload: request
};
}
export function fetchPages() {
/* here is where I'd like the header to be attached automatically if the user
has logged in */
const request = axios.get(PAGES_URL);
return {
type: FETCH_PAGES,
payload: request
};
}
// reducers.js
const initialState = …Run Code Online (Sandbox Code Playgroud) 我的用户模型中有一些字段是选择字段,我正在试图找出如何最好地将其实现到Django Rest Framework中.
下面是一些简化的代码来展示我正在做的事情.
# models.py
class User(AbstractUser):
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
# serializers.py
class UserSerializer(serializers.ModelSerializer):
gender = serializers.CharField(source='get_gender_display')
class Meta:
model = User
# viewsets.py
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)
基本上我要做的是让get/post/put方法使用选择字段的显示值而不是代码,看起来像下面的JSON.
{
'username': 'newtestuser',
'email': 'newuser@email.com',
'first_name': 'first',
'last_name': 'last',
'gender': 'Male'
// instead of 'gender': 'M'
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?上面的代码不起作用.在我有这样的东西为GET工作之前,但对于POST/PUT它给了我错误.我正在寻找关于如何做到这一点的一般建议,看起来它会是常见的,但我找不到例子.或者我正在做一些非常错误的事情.
我有一个论坛主题模型,我想在计算的SerializerMethodField上订购,例如vote_count.以下是一个非常简化的Model,Serializer和ViewSet来显示问题:
# models.py
class Topic(models.Model):
"""
An individual discussion post in the forum
"""
title = models.CharField(max_length=60)
def vote_count(self):
"""
count the votes for the object
"""
return TopicVote.objects.filter(topic=self).count()
# serializers.py
class TopicSerializer(serializers.ModelSerializer):
vote_count = serializers.SerializerMethodField()
def get_vote_count(self, obj):
return obj.vote_count()
class Meta:
model = Topic
# views.py
class TopicViewSet(TopicMixin, viewsets.ModelViewSet):
queryset = Topic.objects.all()
serializer_class = TopicSerializer
Run Code Online (Sandbox Code Playgroud)
这是有效的:
/topics?ordering=title我试图通过TopicSerializer上的MethodField订购,/topics?ordering=-vote_count但是看起来似乎不支持.我有什么方法可以通过那个领域订购吗?
我简化的JSON响应如下所示:
{
"id": 1,
"title": "first post",
"voteCount": 1
},
{
"id": 2,
"title": "second post", …Run Code Online (Sandbox Code Playgroud) 我有一个使用react/axios的chrome扩展.在那个应用程序中,我发送一个帖子请求,如下所示:
export const createComment = payload => {
const url = `${COMMENTS_BASE_URL}`;
const promise = axios.post(url, payload);
return { type: CREATE_COMMENT, promise };
}
Run Code Online (Sandbox Code Playgroud)
即使它显然是axios.post(),浏览器也会向URL发送GET请求,这是不允许的(响应405).我也试过使用axios({ method: 'post', ... })但是发送GET请求的浏览器也会发生同样的事情.
我正在将Stripe实施到一个django网站,除了一部分外,一切正常.在我的购物车中,用户可以更新更改总数的项目.除了在Stripe Checkout js脚本上设置数据量之外,一切都正常工作.
当页面加载时,一切都很好,但是如果客户更改了他们的购物车,则数据量不会更新.我有另一个显示总数的框,这个数量更新很好.
<!-- here is the script tag in HTML-->
<script
id="stripe-script"
src="https://checkout.stripe.com/checkout.js"
class="stripe-button"
data-image="{% static 'img/marketplace.png' %}"
data-key="{{ STRIPE_PUBLIC_KEY }}"
data-name="Serendipity Artisan Blends"
data-description="Purchase Items"
data-amount="{{ cart_stripe_total }}">
</script>
Run Code Online (Sandbox Code Playgroud)
然后我尝试更新的javascript是这样的:
function updateTotal(amount) {
/* update the total in the cart in both the table cell and
in the stripe button data-amount */
var totalStr = shoppingTotalCell.text().replace('$', ''),
originalTotal = parseFloat(totalStr),
newTotal = originalTotal + amount,
newTotalStripe = newTotal * 100,
newTotalStr = newTotal.toFixed(2),
script = $('#stripe-script'); …Run Code Online (Sandbox Code Playgroud) 我有以下使用Django REST Framework的 Serializer .
这就是我到目前为止......
serializer.py
class ProductSerializer(serializers.ModelSerializer):
score = serializers.SerializerMethodField('get_this_score')
class Meta:
model = Product
fields = ('id', 'title', 'active', 'score')
def get_this_score(self, obj):
profile = Profile.objects.get(pk=19)
score = [val for val in obj.attribute_answers.all() if val in profile.attribute_answers.all()]
return (len(score))
Run Code Online (Sandbox Code Playgroud)
urls.py
url(r'^products/(?P<profile_id>.+)/$', ProductListScore.as_view(), name='product-list-score'),
Run Code Online (Sandbox Code Playgroud)
这段代码存在一些问题.
1)pram pk = 19是硬编码的应该是self.kwargs['profile_id'].我尝试过但尝试过,但我不知道如何将kwarg传递给方法并且无法使profile_id工作.即我无法从网址获取.
2)这些代码中是否有任何代码?我已经尝试添加模型,但再次可以通过args.
models.py 即方法类
def get_score(self, profile):
score = [val for val in self.attribute_answers.all() if val in
profile.attribute_answers.all()]
return len(score)
Run Code Online (Sandbox Code Playgroud) 我试图限制模型记录在ManyToManyField中可以有的最大选择量.
在此示例中,有一个可以与Regions相关的BlogSite.在这个例子中,我想限制BlogSite只能有3个区域.
这似乎是之前会被问到/回答过的东西,但经过几个小时的探索之后,我找不到任何接近的东西.对于这个项目,我正在使用Django 1.3.
#models.py
class BlogSite(models.Model):
blog_owner = models.ForeignKey(User)
site_name = models.CharField(max_length=300)
region = models.ManyToManyField('Region', blank=True, null=True)
....
class Region(models.Model):
value = models.CharField(max_length=50)
display_value = models.CharField(max_length=60)
....
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我想确保request.user只能发出一个POST请求来创建一个论坛主题,在这个主题中他们是作者.使用PUT和DELETE我能够通过使用has_object_permission但是通过POST 来实现它我无法做到这一点,我猜测因为尚未创建对象.
class TopicPermission(IsAuthenticatedOrReadOnly):
"""
Any user should be able to read topics but only authenticated
users should be able to create new topics. An owner or moderator
should be able to update a discussion or delete.
"""
def has_object_permission(self, request, view, obj):
if request.method in SAFE_METHODS:
return True
# Instance must have an attribute named `author` or moderator
return obj.author == request.user or request.user.forum_moderator
Run Code Online (Sandbox Code Playgroud)
我如何request.user == obj.author在POST请求中进行验证?
我正在使用Elastic Beanstalk将Django项目部署到AWS,但我仍然无法迁移数据库.
我在哪里:我能够成功部署我的django项目并通过mysubdomain.elasticbeanstalk.com加载页面.页面加载没有错误,直到我到达需要进行数据库调用的页面.然后我得到一个错误,relation "accounts_user" does not exist LINE 1: SELECT COUNT(*) FROM "accounts_user"因为我的数据库尚未迁移.
我尝试过的东西:我尝试了很多不同的东西.幸运的是,有大量的stackoverflow帖子和几个教程.不幸的是,他们似乎都在使用不同的版本,他们的建议并不适用于我的项目.
我很清楚,我需要在foobar.config文件.ebextensions/夹内的文件中运行迁移.这是我想要做的基础:
container_commands:
01_migrate:
command: "python manage.py migrate --noinput"
leader_only: true
Run Code Online (Sandbox Code Playgroud)
在日志中,我看到后部署脚本尝试运行但失败了.我没有收到有关错误的任何其他信息,我唯一看到的是"错误:01_migrate部署后脚本失败"
我发现我需要激活命令的虚拟环境,这是有道理的.从asdf我试试这个:
container_commands:
01_migrate:
command: "source /opt/python/run/venv/bin/activate && python rlg/manage.py migrate --noinput"
leader_only: true
Run Code Online (Sandbox Code Playgroud)
但它不起作用.事实上,通过SSH我发现我甚至没有/ opt/python /文件夹,只有/ opt/aws /和/ opt/elasticbeanstalk /.所有教程和SO问题都引用了这个文件夹,但我没有它?
版本:Python 3.4.1,Django 1.7.7,AWS CLI 3.2.1,Postgres 9.3
我正在实现 rtk-query,并且库的轮询功能遇到问题。
### service.js
export const api = createApi({
...,
endpoints: (builder) => ({
getBlockPurchase: builder.query({
query: (id) => `block-purchases/${id}/`,
}),
}),
});
### component.js
function BlockPurchaseComponent({ blockPurchaseId }) {
const { data, error } = useGetBlockPurchaseQuery(blockPurchaseId, {
pollingInterval: 3000,
});
...
}
Run Code Online (Sandbox Code Playgroud)
查询一次可以正常工作,但后续的轮询请求不会发送。在文档中它看起来很简单,但看起来我错过了一些东西。请让我知道有助于找到解决方案的任何其他信息。
编辑:这是设置不正确的中间件:
const store = configureStore({
reducer: persistedReducer,
middleware: getDefaultMiddleware({
serializableCheck: {
ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
},
...api.middleware,
}),
});
Run Code Online (Sandbox Code Playgroud)