
light
26.10.2016
19:35:38
это переопределение декоратора @user_requier

Igor
26.10.2016
19:36:05
@login_required*
да нет, почему сразу переопределение. login_required много чего решает.
а у тебя всего лишь редирект будет, если от клиента пришел запрос на редирект

light
26.10.2016
19:37:05
эх
пойду покурю

Google

Igor
26.10.2016
19:37:43
вон на стековерфлоу готовую мидлварю сделали
http://stackoverflow.com/a/10951158/974317

light
26.10.2016
19:37:47
т.е. если я этот декоратор пропишу во вьюхе- то редирект заработет?

Igor
26.10.2016
19:37:55
бля, эт не то
зато ты можешь взять ее и шустро допилить под свои нужды, и не надо будет никакие декораторы нахуй нигде ставить
с другой стороны, зачем тебе лишняя мидлваря с возможностью переадресации на всех вьюхах
а когда залогинится - вернется обратно на /shop/куда-то-там/, откуда пришел, короче
(его туда принесет джанговский декоратор, собственно)
т.е. переадресация, как мне кажется, будет работать ни разу не так, как тебе надо %)

light
26.10.2016
19:42:45
все верно

Igor
26.10.2016
19:43:23
да сделай ты просто, во вьюхе
def my_view(request):
# ...
if request.method == 'POST':
# ...
redirect_url = request.POST.get('next')
if redirect_url:
return redirect(redirect_url)
# ...
return ...
в шаблоне
<form method="post" action="/my/view/">
<input type="hidden" name="next" value="{{ request.path }}">
</form>
ты говорил, что шаблон с формой на отдельной странице. в смысле, в отдельном шаблоне? (.html файлике)
или именно в отдельной вьюхе?
если второе, то {{ request.path }} тебя не спасет, он ж будет возвращать текущий путь, к странице с формкой, на которой юзер щас находится
значит его будет бесконечно редиректить
тьфу, не бесконечно конечно, раз POST
в любом случае его назад на эту же форму редиректнет тогда :)

Google

Johnnie
26.10.2016
19:44:46
Кстати, как должна выглядеть функция next_if_valid во фласке при подобных редиректах?
Или как-то похоже называется, не помню

Igor
26.10.2016
19:45:36
ну, эта функция должна отсекать все get-аргументы, чтоб осталась чисто ссылка, а потом сравнивать ее со всеми роутами в проекте
если не нашлось - слать нахуй (403 показывать, 404, на главную странцу отправлять, да че угодно)
если нашлось - подчиняться

F
26.10.2016
19:46:23
придумал как еще жощще сделать чат
а что, если в диалоге хранить не время последнего сообщения, а само последнее сообщения по OneToOne?
ну и индексировать тож
прокатит?

Johnnie
26.10.2016
19:46:57

Igor
26.10.2016
19:46:59
ну и не только get-аргументы, ведь там шаблонное форматирование тоже есть
ну, типа, /api/users/123/ и /api/users/456/ - это один и тот же роут/вьюха, по факту
(ну и у юзера есть к ней доступ)

Johnnie
26.10.2016
19:47:32
Нет, я имею в виду без этой проверки

Igor
26.10.2016
19:47:44
а как ты это сделаешь?

Johnnie
26.10.2016
19:47:44
Запросил хуйню -ушел в 404

F
26.10.2016
19:47:51
@iamigor шо думаешь?

Johnnie
26.10.2016
19:48:08
Ну это же будет обычное обращение в роуты

Igor
26.10.2016
19:48:38
Запросил хуйню -ушел в 404
а, в этом смысле.
а если он хакнет твой сайт и будет подставлять в next всем юзерам, например, hot-gay-pre-teen.com?
> Warning: You MUST validate the value of the next parameter. If you do not, your application will be vulnerable to open redirects.
собстна, из документации flask-login

Google

Johnnie
26.10.2016
19:49:25
Как хакнет? Если хакнет, то там уже пох на этот текст)
Некст

Igor
26.10.2016
19:49:30
и вот страничка на овасп
https://www.owasp.org/index.php/Unvalidated_Redirects_and_Forwards_Cheat_Sheet

Johnnie
26.10.2016
19:49:46
Если мы и так телодвижения ограничиваем роутами

Igor
26.10.2016
19:50:14
https://habrahabr.ru/company/pt/blog/247709/
http://v-resheno.ru/610347-how-to-avoid-open-redirect-vulnerability-and-safely-redirect-on-successful-login
вот просто охуительный пример
http://www.mybank.com/logon?returnUrl=http://www.badsite.com

Владислав
26.10.2016
19:51:16
Мужчины, как поставить библиотеку json для винды?

Igor
26.10.2016
19:51:23
pip install json?

.
26.10.2016
19:51:42
TemplateDoesNotExist at /polls
polls/index.html
Template-loader postmortem
Django tried loading these templates, in this order:
Using engine django:
django.template.loaders.app_directories.Loader: /home/pc/py3env/lib/python3.5/site-packages/django/contrib/admin/templates/polls/index.html (Source does not exist)
django.template.loaders.app_directories.Loader: /home/pc/py3env/lib/python3.5/site-packages/django/contrib/auth/templates/polls/index.html (Source does not exist)
Теперь выдает вот это, после смены названия папки templates на template

F
26.10.2016
19:51:46
@_@

Igor
26.10.2016
19:52:01
ты истроию проебешь
история прригодится
че если у юзера два телефона и планшет?

F
26.10.2016
19:52:15

Igor
26.10.2016
19:52:26
а как ты будешь запрашивать предыдущие сообщения в диалоге?

Google

Igor
26.10.2016
19:52:48
pip install simplejson? ))

F
26.10.2016
19:52:57

Igor
26.10.2016
19:53:08
а, я тебя не понял изначально

Владислав
26.10.2016
19:53:13

Igor
26.10.2016
19:53:29
О! пасибули)
стоп, а че, под виндой нету из-под коробки библиотеки для работы с json? O_O

F
26.10.2016
19:53:34
просто чтоб выдачу сделать как в ВК мне нужно не просто время последнего сообщения для сортировки диалогов знать, а еще и кто это сообщение отправил

Admin
ERROR: S client not available

b0g3r
26.10.2016
19:54:17

Igor
26.10.2016
19:54:20
не надо индексировать тексты сообщений, нахуя
Естт
бля, мне щас зарт пизды вломит за то, что я человека отправил simplejson скачивать

b0g3r
26.10.2016
19:54:53

F
26.10.2016
19:55:00
чтоб получать именно диалоги на страницу диалогов, тк запросы будут к ней часто
я и не собирался текст индексировать

light
26.10.2016
19:55:04

F
26.10.2016
19:55:10
ща напишу че хочу

light
26.10.2016
19:55:30
а если я её хочу потом в контекст процессор запилить потом?

F
26.10.2016
19:55:48
class ChatDialog(models.Model):
created_at = models.DateTimeField()
from_user = models.ForeignKey('User',db_index=True, related_name='dialogs_from')
to_user = models.ForeignKey('User', db_index=True, related_name='dialogs_to')
last_message = models.OneToOneField('ChatMessage', db_index=True)

Igor
26.10.2016
19:56:13
ща напишу че хочу
во, вроде понял
но че мешает сделать так?
SELECT user_from, timestamp, message FROM messages WHERE user_to = self.request.user.id GROUP BY user_from ORDER BY timestamp DESC LIMIT 1;

F
26.10.2016
19:56:57
хотя лол мб просто юзерайди писать

Google

F
26.10.2016
19:57:34
хоть стрингом :D
чтоб оно не бегало за юзером в таблицу

Igor
26.10.2016
19:57:50
так у тебя и будет по-минимуму нагружаться, че там
мой запрос как пример
по факту будет че-т типа select timestamp, message from messages where dialog_id in (select id from dialog where user_to = self.request.user.id)
не вижу в этом ниче плохого

light
26.10.2016
19:57:58
снов люди

Igor
26.10.2016
19:57:58
по timestamp и юзерам есть индексы
и по диалогам

light
26.10.2016
19:58:04
завтра еще отпишу
Игорь, спасибо тебе

Igor
26.10.2016
19:58:11
доброй
хотя, наверное, здесь можно сраться вечно, не зря там кучу нормальных форм придумали
с одной стороны, дублируешь данные
с другой стороны, обращаешься к двум таблиццам
что там хуйня, что здесь хуйня %)

F
26.10.2016
19:59:09
select timestamp, message from messages where dialog_id in (select id from dialog where user_to = self.request.user.id) or dialog_id in (select id from dialog where user_from = self.request.user.id) - а не так разве будет?

Igor
26.10.2016
19:59:46
можно ж упростить
select timestamp, message from messages where dialog_id in (select id from dialog where self.request.user.id in (user_from, user_to))
но да, ты прав

Johnnie
26.10.2016
20:00:14
вот просто охуительный пример
Спасибо, надо теперь подумать как его реализовать. Только сначала проект заново надо написать ибо исходники пошли по пизде :(

Igor
26.10.2016
20:00:33
или в гитлабчики там всякие, битбакеты

F
26.10.2016
20:00:46
:С

Igor
26.10.2016
20:00:48
заодно их подтянешь, пригодится рано или поздно
Эта группа больше не существует