小编dkh*_*upt的帖子

Django REST Framework分页链接不使用HTTPS

我正在为某个运行良好的DRF端点设置分页 - 但是当我在使用HTTPS的服务器上部署时,会形成到下一页和上一页的链接http://而不是https://.这会导致浏览器阻止对下一页/上一页的请求.

我已经使用HTTPS仔细检查了初始请求是否已发出,并且此问题的第二个答案表明它应该在形成的URL中使用HTTPS,因为请求来自HTTPS.

对同一个问题的第一个答案也没有帮助X-Forwarded-Proto- 我将这条线添加到我的nginx配置并重新加载,但无济于事.

DRF文档提到reverse()应该表现为基本Django反向,但是很明显初始请求是HTTPS而返回的URL是HTTP.

以下是显示初始request(https://<domain>.com/api/leaderboard/)的几个屏幕截图:

在此输入图像描述

随着响应包含next: http://<domain>.com/api/leaderboard/?page=2):

在此输入图像描述

我认为这将是一个简单的设置,但在搜索此站点和DRF站点后仍无法找到任何内容.

这是我的nginx配置:

 location / {
    # proxy_pass http://127.0.0.1:9900;
    proxy_set_header X-Forwarded-Host $server_name;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';

    root /opt/app/client/dist;
    index index.html index.htm;

}
Run Code Online (Sandbox Code Playgroud)

这个问题包含一个非常详细的答案,但最终说网址是由与请求相同的协议组成的,这似乎不是这里的情况.我需要设置Django SECURE_PROXY_SSL_HEADER吗?鉴于警告说它可能不安全,我不确定.

django django-rest-framework

16
推荐指数
2
解决办法
2173
查看次数

Django REST Framework:将TokenAuthentication与可浏览的API一起使用

我正在关注DRF文档来设置TokenAuthentication,并且无法使用可浏览的API.我相信我添加了正确的行settings.py:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
    ),

INSTALLED_APPS = (
   ...
'rest_framework',
'rest_framework.authtoken',
   ...
Run Code Online (Sandbox Code Playgroud)

以及使用文档中的代码段为现有用户生成令牌.如果我查询authtoken_token表,我可以看到每个用户的令牌,所以我知道它们存在.

每次我尝试登录可浏览的API时,都会返回以下内容:

HTTP 401 Unauthorized
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
WWW-Authenticate: Token

{
"detail": "Authentication credentials were not provided."
}
Run Code Online (Sandbox Code Playgroud)

所以它似乎是尝试Token身份验证,但这个消息有点奇怪.当我输入错误的密码时,我会在登录表单上收到"输入正确的密码"消息.当我输入正确的密码时,它似乎登录,但带我到API根目录,并显示上面的消息,并在顶部菜单上显示"登录",而不是用户名.

这可能与我的自定义用户模型有关吗?或者可能是因为我目前正在开发使用dev服务器,它不支持https- DRF文档提到需要HTTPS和TokenAuthentication,尽管我不确定这是最佳做法还是实际需要.

django django-rest-framework

15
推荐指数
2
解决办法
2945
查看次数

Django REST框架:设置嵌套序列化程序的预取

我的Django驱动的应用程序与DRF API工作正常,但我已经开始遇到性能问题,因为数据库填充了实际数据.我已经使用Django Debug Toolbar进行了一些分析,发现我的许多端点在返回数据的过程中会发出数十到数百个查询.

我期待这一点,因为我之前没有对数据库查询进行任何优化.现在我正在设置预取,但是当串行器嵌套在不同的串行器中时,我在使用正确预取的串行器数据时遇到了麻烦.我一直在使用这篇精彩的帖子作为如何考虑预取的不同方法的指南.

目前,ReadingGroup当我点击/api/readinggroups/端点时,我的序列化程序会正确预取.我的问题是/api/userbookstats/端点,它返回所有UserBookStats对象.相关的序列化程序UserBookStatsSerializer有一个嵌套的ReadingGroupSerializer.

模型,序列化程序和视图集如下:

models.py

class ReadingGroup(models.model):
    owner = models.ForeignKeyField(settings.AUTH_USER_MODEL)
    users = models.ManyToManyField(settings.AUTH_USER_MODEL)
    book_type = models.ForeignKeyField(BookType)
    ....
    <other group related fields>

   def __str__(self):
     return '%s group: %s' % (self.name, self.book_type)

class UserBookStats(models.Model):
    reading_group = models.ForeignKey(ReadingGroup)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    alias = models.CharField()

    total_books_read = models.IntegerField(default=0)
    num_books_owned = models.IntegerField(default=0)
    fastest_read_time = models.IntegerField(default=0)
    average_read_time = models.IntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)

serializers.py

class ReadingGroupSerializer(serializers.ModelSerializer):
    users = UserSerializer(many = True,read_only=True)
    owner = …
Run Code Online (Sandbox Code Playgroud)

django django-rest-framework

15
推荐指数
2
解决办法
7052
查看次数

Angular 2:模块内的路由(二级嵌套路由器 - 出口)

我一直在玩这里找到的Angular 2 webpack启动器,它有很多有用的例子.不过,我遇到了路由问题.我删除了一些模块并添加了我自己的模块,其中包含子项(我仍然不确定使用子模块或子组件是否是最佳实践 - 我目前正在尝试使用组件).

我的目标是能够为正常(顶层模块之间进行切换Home,并About在这种情况下),但加载我经过Home多个子组件之间的模块,交换(或模块,如果是更好的支持)的内部Home模块的模板.

我试图用另一种<router-outlet>Home-我试过将其命名和使用outlet在放慢参数Home模块路由定义,但点击链接内加载Home当前不工作.代码如下:

这是我目前的应用程序结构(大部分额外的webpack东西都被遗漏了):

app
  |-app.component.ts (template contains router-outlet)
  |-app.module.ts
  |-app.routes.ts
  |-about
    |-about.component.ts
    |-about.component.html
  |-home
    |-home.module.ts
    |-home.component.ts
    |-home.component.html (contains router outlet for children)
    |-home.routes.ts
    |-signup
      |-signup.component.ts
      |-signup.component.html
    |-login
      |-login.component.ts
      |-login.component.html
Run Code Online (Sandbox Code Playgroud)

这是我的app.component,它与它在启动器repo中的启动几乎相同 - 我刚刚添加了一个链接到我自己的模块并删除了其他模块:

app.component.ts

import {
 Component,
  OnInit,
  ViewEncapsulation
} from '@angular/core';

@Component({
  selector: 'app',
  encapsulation: ViewEncapsulation.None,
  styleUrls: [
    './app.component.css'
  ],
  template: `
    <nav>
      <a [routerLink]=" …
Run Code Online (Sandbox Code Playgroud)

angular2-routing angular

14
推荐指数
1
解决办法
9683
查看次数

Celery(Django + Redis)任务失败:“无法建立连接,因为目标机器主动拒绝”

更新:为了简单起见,我决定尝试使用 Django 作为代理,因为我假设我在 Redis 设置中做错了什么。但是,在进行文档中描述的更改后,当尝试使用.delay(). Celery 工作线程启动并显示它已连接到 Django 以进行传输。这可能是防火墙问题吗?

\n

原来的

\n

我正在开发一个 Django 项目并尝试添加后台任务。我已经安装了 Celery 并选择了 Redis 作为代理,并且也安装了它(我在 Windows 机器上,仅供参考)。celery Worker 启动,连接到 Redis 服务器,并发现我的shared_tasks

\n
 -------------- celery@GALACTICA v3.1.19 (Cipater)\n---- **** -----\n--- * ***  * -- Windows-7-6.1.7601-SP1\n-- * - **** ---\n- ** ---------- [config]\n- ** ---------- .> app:         proj:0x2dbf970\n- ** ---------- .> transport:   redis://localhost:6379/0\n- ** ---------- .> results:     disabled\n- *** --- * --- .> concurrency: 8 (prefork)\n-- ******* ----\n--- ***** ----- [queues]\n -------------- .> …
Run Code Online (Sandbox Code Playgroud)

python django redis celery celery-task

6
推荐指数
2
解决办法
6062
查看次数

Django,Angular和DRF:Django后端与API的身份验证

我正在构建一个带有Django后端,Angular前端和使用Django REST Framework for Angular来使用的REST API的应用程序.当我还在使用香草前端制作后端内容时,我使用提供的Django身份验证来处理用户身份验证 - 但现在我正在创建一个基于REST的应用程序,我不知道如何进行身份验证.

由于所有用户数据都将通过API检索或提交,API认证是否足够?如果是这样,我是否需要删除现有的Django身份验证中间件?

现在,当我尝试打在应用程序的早期版本API终点,我引导到什么样子的Django的登录表单.如果我输入有效的用户名和密码,则不起作用 - 只是提示再次登录.删除基本的Django身份验证会阻止这种情况吗?我想提示登录,但我不知道如何使用这些技术来处理.

包django-rest-auth看起来很有用,同一个组创建了一个Angular模块 - 但是文档并没有经过安装和提供的端点.最后,我认为这个问题的核心是:如何完全将认证从Django提供的内容转换为django-rest-auth或DRF推荐的其他第三方软件包之一?

编辑:我在下面做了这个评论,但我意识到我需要弄清楚auth的组合方式.我没有构建单页应用程序,因此将从Django提供单独的基本页面,但每个页面将访问各种API端点以检索所需的数据.有没有办法让django-rest-auth处理所有身份验证?

python django django-rest-framework django-rest-auth

5
推荐指数
1
解决办法
614
查看次数

Django:在queryset update()中使用带注释的聚合

在添加到现有项目的新应用程序中,我遇到了一种有趣的情况。我的目标是(使用Celery任务)使用包含外键对象的带注释的聚合值的值一次更新许多行。这是我在之前的问题中使用过的一些示例模型:

class Book(models.model):
    author = models.CharField()
    num_pages = models.IntegerField()
    num_chapters = models.IntegerField()

class UserBookRead(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    user_book_stats = models.ForeignKey(UserBookStats)
    book = models.ForeignKey(Book)
    complete = models.BooleanField(default=False)
    pages_read = models.IntegerField()

class UserBookStats(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    total_pages_read = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

我正在尝试:

  1. 当页数更新时,请使用post_save来自Book实例的信号来更新pages_read相关UserBookRead对象Book
  2. 在信号结束时,启动后台Celery任务以汇总pages_read每个UserBookRead已更新的任务,并更新total_pages_read每个相关的任务UserBookStats(这是发生问题的地方)

我正在尝试尽可能地减少查询的数量-步骤1已经完成,并且只需要对我的实际用例进行少量查询,只要适当地优化了这些查询,这对于信号处理程序似乎是可接受的。

步骤2涉及更多,因此委派给后台任务。我已经设法以一种非常干净的方式完成了大部分任务(至少对我而言)。

我遇到的问题是,当UserBookStats使用total_pages聚合(Sum()所有pages_read相关UserBookRead对象的全部)注释查询集时,我不能直接update使用查询集来设置total_pages_read字段。

这是代码(Book实例作为传递给任务book): …

django django-orm

3
推荐指数
1
解决办法
1300
查看次数

Django:无法设置app ready()来导入信号

我正在点击常见的"模型尚未加载"错误,这个错误来自于导入我的应用程序的单独信号文件models.py.我找到了2个关于如何创建AppConfig并在ready()函数中导入信号的简单指南,但我无法使其工作.我正在使用这里的顶部答案以及博客文章.

部分原因可能是因为我的整个项目都有一个名称,funproj并且大部分代码所在的主应用程序被有效地调用app- 我正在使用Visual Studio和Python Tools for VS并且它生成了这个结构当我创建项目时.这是层次结构:

funproj
|--- __init__.py
|--- setttings.py
|--- urls.py
|
|--app
|   |--- __init__.py
|   |--- models.py
|   |--- signals.py
|
|--otherapp
|   |--- __init__.py
|   |--- other stuff
Run Code Online (Sandbox Code Playgroud)

这是缩写,但我已尝试在两者之下放置所需的apps.py相关代码,但两种方法都不起作用.这就是我对每一个人的看法:__init.py__funprojapp

apps.py

from django.apps import AppConfig

class FunProjAppConfig(AppConfig):
  name = 'app'

  def ready(self):
    from app import signals
Run Code Online (Sandbox Code Playgroud)

__init.py__补充

#import signals in the app config
default_app_config = 'app.apps.FunProjAppConfig'
Run Code Online (Sandbox Code Playgroud)

app因为它包含了需要加载的信号,所以有了这个代码对我来说更有意义,但是我链接的例子对我来说并不清楚.一个人提到'app目录',但我不确定这是否真的意味着app,或者他们是否正在使用app作为项目的同义词. …

python django django-signals django-models

1
推荐指数
1
解决办法
2224
查看次数