我正在为某个运行良好的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吗?鉴于警告说它可能不安全,我不确定.
我正在关注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驱动的应用程序与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) 我一直在玩这里找到的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) 更新:为了简单起见,我决定尝试使用 Django 作为代理,因为我假设我在 Redis 设置中做错了什么。但是,在进行文档中描述的更改后,当尝试使用.delay(). Celery 工作线程启动并显示它已连接到 Django 以进行传输。这可能是防火墙问题吗?
原来的
\n我正在开发一个 Django 项目并尝试添加后台任务。我已经安装了 Celery 并选择了 Redis 作为代理,并且也安装了它(我在 Windows 机器上,仅供参考)。celery Worker 启动,连接到 Redis 服务器,并发现我的shared_tasks
-------------- 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) 我正在构建一个带有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处理所有身份验证?
在添加到现有项目的新应用程序中,我遇到了一种有趣的情况。我的目标是(使用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)
我正在尝试:
post_save来自Book实例的信号来更新pages_read相关UserBookRead对象Book。pages_read每个UserBookRead已更新的任务,并更新total_pages_read每个相关的任务UserBookStats(这是发生问题的地方)我正在尝试尽可能地减少查询的数量-步骤1已经完成,并且只需要对我的实际用例进行少量查询,只要适当地优化了这些查询,这对于信号处理程序似乎是可接受的。
步骤2涉及更多,因此委派给后台任务。我已经设法以一种非常干净的方式完成了大部分任务(至少对我而言)。
我遇到的问题是,当UserBookStats使用total_pages聚合(Sum()所有pages_read相关UserBookRead对象的全部)注释查询集时,我不能直接update使用查询集来设置total_pages_read字段。
这是代码(Book实例作为传递给任务book): …
我正在点击常见的"模型尚未加载"错误,这个错误来自于导入我的应用程序的单独信号文件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作为项目的同义词. …