首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >testdriven.io:开发带有Django通道和角的实时出租车应用程序:无法在gcp的前端注册

testdriven.io:开发带有Django通道和角的实时出租车应用程序:无法在gcp的前端注册
EN

Stack Overflow用户
提问于 2022-03-26 14:39:32
回答 1查看 214关注 0票数 3

我正在学习GCE上的教程https://testdriven.io/courses/real-time-app-with-django-channels-and-angular/,并且能够与前端以及Django管理和API交互。然而,当我试图从角前端点击注册(http POST)时,我看到了一个403错误。

我认为失败发生在我的onSumbit()的订阅部分。触发onSubmit()的表单没有来自序列化程序的password2参数,我不确定这是否是这里的断点。

代码语言:javascript
复制
onSubmit(): void {
    this.authService.signUp(
      this.user.username,
      this.user.firstName,
      this.user.lastName,
      this.user.password,
      this.user.group,
      this.user.photo
    ).subscribe({
      complete: () => this.router.navigateByUrl('/log-in'),
      error: (error) => console.error(error),
    }); 

控制台错误是

代码语言:javascript
复制
HttpErrorResponse {headers: HttpHeaders, status: 403, statusText: 'Forbidden', url: 'http://35.274.59.16:8080/api/sign_up/', ok: false, …}
error: {detail: 'CSRF Failed: CSRF token missing.'}
headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}
message: "Http failure response for http://35.274.59.16:8080/api/sign_up/: 403 Forbidden"
name: "HttpErrorResponse"
ok: false
status: 403
statusText: "Forbidden"
url: "http://35.274.59.16:8080/api/sign_up/"
[[Prototype]]: HttpResponseBase

我的Django序列化程序:

代码语言:javascript
复制
from django.contrib.auth import get_user_model
from rest_framework import serializers
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer 
from django.contrib.auth.models import Group
from .models import Trip

class UserSerializer(serializers.ModelSerializer):
    password1 = serializers.CharField(write_only=True)
    password2 = serializers.CharField(write_only=True)
    group = serializers.CharField()

    def validate(self, data):
        if data['password1'] != data['password2']:
            raise serializers.ValidationError('Passwords must match.')
        return data

    def create(self, validated_data):
        group_data = validated_data.pop('group')
        group, _ = Group.objects.get_or_create(name=group_data)
        data = {
            key: value for key, value in validated_data.items()
            if key not in ('password1', 'password2')
        }
        data['password'] = validated_data['password1']
        user = self.Meta.model.objects.create_user(**data)
        user.groups.add(group)
        user.save()
        return user

    class Meta:
        model = get_user_model()
        fields = (
            'id', 'username', 'password1', 'password2',
            'first_name', 'last_name', 'group',
            'photo', # new
        )
        read_only_fields = ('id',)

class LogInSerializer(TokenObtainPairSerializer): # new
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)
        user_data = UserSerializer(user).data
        for key, value in user_data.items():
            if key != 'id':
                token[key] = value
        return token

class TripSerializer(serializers.ModelSerializer):
    class Meta:
        model = Trip
        fields = '__all__'
        read_only_fields = ('id', 'created', 'updated',)

class NestedTripSerializer(serializers.ModelSerializer):
    class Meta:
        model = Trip
        fields = '__all__'
        depth = 1

这是我的船坞。

代码语言:javascript
复制
version: '3'

services:
  taxi-redis:
    container_name: taxi-redis
    image: redis:6.2-alpine

  taxi-database:
    container_name: taxi-database
    environment:
      - POSTGRES_PASSWORD
    image: postgres:14.1
    ports:
      - 5433:5432
    volumes:
      - taxi-database:/var/lib/postgresql/data

  taxi-server:
    build:
      context: ./server
    command: daphne --bind 0.0.0.0 --port 8000 taxi.asgi:application
    # command: python manage.py runserver 0.0.0.0:8000
    container_name: taxi-server
    depends_on:
      - taxi-redis
      - taxi-database
    env_file:
      - ./server/.env
    ports:
      - 8001:8000
    volumes:
      - ./server:/usr/src/app
      - media:/usr/src/app/media # new
      - static:/usr/src/app/static # new

  taxi-client:
    build:
      context: ./client
    command: ng serve --host 0.0.0.0
    container_name: taxi-client
    depends_on:
      - taxi-server
    environment:
      - CHROME_BIN=chromium-browser
    ports:
      - 4201:4200
    volumes:
      - ./client:/usr/src/app

  nginx:
    build:
      context: ./nginx
    container_name: taxi-nginx
    depends_on:
      - taxi-server
      - taxi-client
    ports:
      - 8080:80
    restart: always
    volumes:
      - media:/usr/src/app/media
      - static:/usr/src/app/static
      # - ./server/static:/usr/src/app/static # added this really late.
      - ./server/media:/usr/src/app/media

volumes:
  taxi-database:
  media:
  static:
EN

回答 1

Stack Overflow用户

发布于 2022-03-27 22:14:48

使用带有SSL证书的域进行路由是令人满意的。不确定这是否是最佳解决方案,甚至对于GCP托管的dev环境也不确定。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71629002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档