Я пытаюсь раскрыть свой метод модели Django с помощью TastyPie и защитить конечную точку с помощью BasicAuthentication, также мне нужно передать пользователя Django, аутентифицированного с помощью BasicAuthentication, в мой метод:
class TaskResource(ModelResource):
class Meta:
queryset = Task.objects.all()
resource_name = 'jenkins_task'
excludes = ['id', 'jenkins_job_name']
authentication = BasicAuthentication()
def prepend_urls(self):
""" Add the following array of urls to the TaskResource base urls """
return [
url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/run%s$" %
(self._meta.resource_name, trailing_slash()),
self.wrap_view('run'), name = "api_task_run"),
]
def run(self, request, **kwargs):
""" proxy for the Task.call_api method """
# create a basic bundle object for self.get_cached_obj_get.
basic_bundle = self.build_bundle(request=request)
print('User: %s' % basic_bundle.request.user)
# using the primary key defined in the url, obtain the task
task = self.cached_obj_get(
bundle=basic_bundle,
**self.remove_api_resource_names(kwargs))
# Return what the method output, tastypie will handle the serialization
return self.create_response(request, task.call_api(basic_bundle.request))
Я отправляю следующий запрос POST:
Preparing request to http://127.0.0.1:8991/api/jenkins_task/7/run/
Using libcurl/7.54.0 LibreSSL/2.0.20 zlib/1.2.11 nghttp2/1.24.0
Connected to 127.0.0.1 (127.0.0.1) port 8991 (#48)
Server auth using Basic with user 'integration'
POST /api/jenkins_task/7/run/ HTTP/1.1
Host: 127.0.0.1:8991
Authorization: Basic aW50ZWdyYXRpb246aW50ZWdyYXRpb24=
User-Agent: insomnia/5.15.0
Content-Type: application/json
Accept: */*
Content-Length: 67
{
"snow_number": "INC000000",
"Store": "0940",
"Service": "RE"
}
Однако я получил код 500, в основном потому, что внутренняя логика внутри метода task.call_api не может найти basic_bundle.request.user.
Итак, мой вопрос: почему переменная запрос, переданная методу run (), не содержит пользователя Django, если она только что была аутентифицирована? Я что-то скучаю?
Кроме того, print('User: %s' % basic_bundle.request.user) возвращает User: AnonymousUser в журнал Django.





Представлению необходимо аутентифицировать пользователя. Пользовательские конечные точки должны это делать, как показано в пример конечной точки поиска. Ознакомьтесь с Resource.dispatch, чтобы узнать о других мелочах, которые вам могут понадобиться в пользовательских представлениях.
Пользователь Django добавляется в запрос после успешная аутентификация.
Благодарю вас! Это то, что мне нужно, я решил свою проблему, просто добавив
self.is_authenticated(request)