Python-сообщество
![]()
- Начало
- » Django
- » Как остановить выполнение метода при удалении объекта
#1 Окт. 21, 2017 15:31:11
AlexReznikov Зарегистрирован: 2017-10-21 Сообщения: 3 Репутация: 0 Профиль Отправить e-mail
Как остановить выполнение метода при удалении объекта
в Джанге у меня есть модель:
class User(models.Model): name = models.CharField(max_length=100) def __init__(self, name): self.name = name def __str__(self): return self.name def search(self, url): while True: time.sleep(0.5) response = requests.get(url, params=<>) print(response) # проверка, выполняется ли метод # далее обрабатываем ответ и шлем новый запрос
Во views я создаю экземпляр класса этой модели и запускаю метод search
from .models import User def my_view(request): user_name = request.GET.get('user') user = User.objects.create(name=username) user.search(url='какой-то-url')
Затем, при определенном событии мне нужно удалить экземпляр данной модели и прекратить выполнение запросов к УРЛ. Для тестирования в консоли Джанго выполняю:
user = User.objects.get(name='username') user.delete()
Но запросы по-прежнему идут и выводятся командой print. Каким образом прекратить выполнение метода при удалении объекта?
Отредактировано AlexReznikov (Окт. 21, 2017 15:33:06)
Твой первый проект на Django!
Часть этой главы основана на учебных пособиях Geek Girls Carrots (https://github.com/ggcarrots/django-carrots).
Отдельные части этой главы основаны на учебном пособии django-marcador , лицензированном под Creative Commons Attribution-ShareAlike 4.0 International License. Руководство django-marcador защищено авторским правом Markus Zapke-Gründemann et al.
Мы собираемся создать простой блог!
Первый шаг — создать новый проект Django. В сущности, это значит, что мы запустим несколько стандартных скриптов из поставки Django, которые создадут для нас скелет проекта. Это просто куча каталогов и файлов, которые мы используем позже.
Названия этих каталогов и файлов очень важны для Django. Ты не должна переименовывать их. Перемещать их в другое место тоже не самая удачная идея. Django необходима определенная структура, чтобы иметь возможность найти важные вещи.
Не забудь: ты должна запускать все команды в virtualenv. Если ты не видишь в командной строке префикса (myvenv) , то необходимо активировать virtualenv. Мы объясняли, как это сделать, в разделе Работаем с virtualenv главы Установка Django. Для этого нужно набрать myvenv\Scripts\activate в Windows или source myvenv/bin/activate в Mac OS / Linux.
OS X или Linux
В консоли Mac OS или Linux нужно запустить следующую команду (не забудь добавить точку . в конце):
(myvenv) ~/djangogirls$ django-admin startproject mysite .
Точка . крайне важна, потому что говорит скрипту установить Django в вашем текущем каталоге (который и обозначается сокращённо точкой . )
Примечание: при вводе приведённой команды помни, что тебе нужно набирать только часть, начинающуюся с django-admin . (myvenv) ~/djangogirls$ — это просто пример строки-приглашения терминала.
Windows
В Windows запусти следующую команду (не забудь добавить точку . в конце):
(myvenv) C:\Users\Name\djangogirls> django-admin.exe startproject mysite .
Точка . крайне важна, потому что говорит скрипту установить Django в вашем текущем каталоге (который и обозначается сокращённо точкой . )
Примечание: при вводе приведённой команды помни, что тебе нужно набирать только часть, начинающуюся с django-admin.exe . (myvenv) C:\Users\Name\djangogirls> — это просто пример приглашения командной строки.
django-admin.py — это скрипт, который создаст необходимую структуру директорий и файлы для нас. Теперь у твоего проекта должна быть следующая структура:
djangogirls ├───manage.py ├───mysite │ settings.py │ urls.py │ wsgi.py │ __init__.py └───requirements.txt
Примечание: в своей структуре директорий ты также увидишь ранее созданную нами директорию с виртуальным окружением.
manage.py — это другой скрипт, который помогает с управлением сайтом. С помощью него мы, помимо прочего, сможем запустить веб-сервер на твоем компьютере без установки дополнительных программ.
Файл settings.py содержит настройки для твоего веб-сайта.
Помнишь нашу аналогию с почтальоном? Файл urls.py содержит список шаблонов, по которым ориентируется urlresolver .
Давай пока забудем про остальные файлы — мы не будем их изменять. Только не удали их случайно!
Изменяем настройки
Давай внесём изменения в mysite/settings.py . Открой файл в текстовом редакторе, который ты выбрала ранее.
Примечание: помни, что settings.py — самый обычный файл. Ты можешь открыть его из своего редактора кода, используя меню «Файл -> Открыть». При этом ты увидишь обычное окно, в котором ты можешь перейти к своему файлу settings.py и выбрать его. Либо ты можешь открыть этот файл, перейдя в директорию проекта djangogirls на твоём рабочем столе и щёлкнув по нему правой кнопкой мыши; затем выбери свой редактор кода из предложенного списка. Важно выбрать именно редактор, поскольку у тебя могут быть установлены программы, которые откроют наш файл, но не позволят его изменить.
Было бы неплохо установить корректный часовой пояс на нашем сайте. Перейди к списку часовых поясов википедии и скопируй название своего часового пояса (TZ) (например, Europe/Moscow ).
В файле settings.py найди строку, содержащую TIME_ZONE , и измени её в соответствии со своим часовым поясом:
TIME_ZONE = 'Europe/Moscow'
Код языка состоит из сокращённого названия языка, например en для английского или ru для русского, и кода страны, например, ru для России или ch для Швейцарии. Тебе понадобится эта настройка, если ты хочешь, чтобы все встроенные кнопки и уведомления от Django были на твоём языке. Таким образом, надпись на кнопке «Cancel» будет переведена на заданный тобой язык. Django поставляется с большим набором готовых переводов.
Измени язык, отредактировав следующую строку:
LANGUAGE_CODE = 'ru-ru'
Нам также необходимо добавить в настройки информацию о расположении статических файлов (мы познакомимся со статическими файлами и CSS в следующих главах). Спустись в конец файла и после переменной STATIC_URL добавь новую — STATIC_ROOT :
STATIC_URL = '/static/' STATIC_ROOT = BASE_DIR / 'static'
Когда наcтройка DEBUG имеет значение True , а настройка ALLOWED_HOSTS пуста, имя хост твоего веб-сайта сверяется со списком [‘localhost’, ‘127.0.0.1’, ‘[::1]’] . Ни одно из значений не будет соответствовать имени хоста на PythonAnywhere при публикации нашего приложения, поэтому нам необходимо изменить следующую настройку:
ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']
Примечание: В случае если вы используете Chromebook, добавьте следующую строку в конец файла settings.py: MESSAGE_STORAGE = ‘django.contrib.messages.storage.session.SessionStorage’
Настройка базы данных
Существует множество различных баз данных, которые могут хранить данные для твоего сайта. Мы будем использовать стандартную — sqlite3 .
Она уже выбрана по умолчанию в файле mysite/settings.py :
DATABASES = < 'default': < 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', > >
Чтобы создать базу данных для нашего блога, набери в командной строке следующее: python manage.py migrate (мы должны быть в директории djangogirls , где расположен файл manage.py ). Если всё прошло успешно, то ты увидишь следующий результат:
(myvenv) ~/djangogirls$ python manage.py migrate Operations to perform: Apply all migrations: auth, admin, contenttypes, sessions Running migrations: Rendering model states. DONE Applying contenttypes.0001_initial. OK Applying auth.0001_initial. OK Applying admin.0001_initial. OK Applying admin.0002_logentry_remove_auto_add. OK Applying contenttypes.0002_remove_content_type_name. OK Applying auth.0002_alter_permission_name_max_length. OK Applying auth.0003_alter_user_email_max_length. OK Applying auth.0004_alter_user_username_opts. OK Applying auth.0005_alter_user_last_login_null. OK Applying auth.0006_require_contenttypes_0002. OK Applying auth.0007_alter_validators_add_error_messages. OK Applying sessions.0001_initial. OK
Вот и всё! Пришло время запустить веб-сервер и посмотреть, работает ли наш веб-сайт!
Запуск веб-сервера
Ты должна быть в директории, где расположен файл manage.py (в нашем случае — djangogirls ). Запустим веб-сервер из командной строки: python manage.py runserver :
(myvenv) ~/djangogirls$ python manage.py runserver
Если ты работаешь в Windows, и команда падает с ошибкой UnicodeDecodeError , используй вместо неё другую:
(myvenv) ~/djangogirls$ python manage.py runserver 0:8000
Теперь тебе нужно проверить, работает ли веб-сайт — открой браузер (Firefox, Chrome, Safari, Internet Explorer или любой другой) и набери следующий адрес:
http://127.0.0.1:8000/
Если ты используешь Chromebook или Cloud9, вместо этого нажми на ссылку во всплывающем окне, которая должна появиться в правом верхнем углу командного окна, в котором запущен веб сервер. Ссылка может выглядеть так:
https://.vfs.cloud9.us-west-2.amazonaws.com
Поздравляем! Ты только что создала свой первый веб-сайт и запустила его на веб-сервере! Ну не круто ли?

Пока работает веб-сервер, в терминале не будет приглашения для ввода команд. Ты всё ещё сможешь ввести текст, но не сможешь выполнить никакую другую команду. Это происходит потому, что сервер продолжает работу, «слушая» входящие запросы.
Мы рассматривали, как работают веб-сервера, в главе Как работает интернет.
Веб-сервер займёт командную строку, пока ты его не остановишь. Чтобы и дальше иметь возможность набирать команды, открой ещё одно окно терминала и активируй в нём виртуальное окружение. Чтобы остановить веб-сервер, перейди обратно в окно, в котором он работает, и нажми CTRL + C — кнопки Control и C вместе (в Windows может потребоваться нажать клавиши Ctrl + Break).
Готова к следующему шагу? Пришло время создать содержимое для нашего блога!
results matching » «
No results matching » «
Как остановить сервер Python?
Скажите, пожалуйста, как можно его тормознуть при закрытии основного окна программы? Можно ли ему через Pipe() какой-то сигнал послать? Вроде такого:
def startServ(secondpipe): . while True: stopSignal = pipe.recv() if stopSignal: break conn, addr = sock.accept() print(addr, "is connected") connectedClients.append(conn) data = conn.recv(1024) dataUnpack = pickle.loads(data) print(dataUnpack) if __name__ == '__main__': (firstpipe, secondpipe) = Pipe() root = Tk() btn = Button(root, text="start server", command=lambda: startServ(secondpipe)) btn.pack() root.mainloop() firstpipe.send("stop")
Но почему-то кажется, что после запуска его сразу же заклинит на строке
stopSignal = pipe.recv()
Так как он будет тупо ждать данные из трубы.
Отслеживать
задан 14 апр 2016 в 8:50
655 7 7 серебряных знаков 21 21 бронзовый знак
простой способ: установить daemon атрибут у Process (оставляя за кадром рациональность смешивания multiprocessing , socket , tkinter APIs здесь).
14 апр 2016 в 20:58
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Если установить daemon атрибут, то процесс будет убит при выходе программы:
def startServ(pipe): Process(target=taskServer, args=(pipe,), daemon=True).start()
Если хочется мягко завершить процесс, то можно Event использовать:
def taskServer(stopped): while not stopped.is_set(): "цикл сервера" stopped = multiprocessing.Event() . stopped.set() # ask the server to exit
В этом случае, тело цикла не должно блокирующих на долго операций иметь, например, sock.accept() следует вызывать только, если select/poll вернули в списке для чтения сокет, на котором вы слушаете входящие соединения. Пример кода—добавьте timeout параметр в select() вызов.
Альтернативно, можно по сигналу выходить, так называемый self-pipe трюк: при получении сигнала пишем в pipe, которую проверяем на чтение в том же процессе в основном цикле с select/poll:
import signal def taskServer(): input_fd, output_fd = os.pipe2(os.O_NONBLOCK | os.O_CLOEXEC) read_set = [input_fd] signal.signal(signal.SIGTERM, lambda signum,frame: os.write(output_fd, b'\0')) # . server_socket.listen(10) read_set.append(server_socket) while True: readable, writable, errored = select.select(read_set, write_set, []) for fd in readable: if fd is input_fd: # got signal to exit os.read(input_fd, 1) # cleanup. break # exit the loop elif fd is server_socket: # new connection client_socket, address = server_socket.accept() read_set.append(client_socket) # get ready to read client's request else: ". "
На Windows, socket.socketpair() вместо pipe можно использовать.
Конечно, не обязательно по сигналу просить сервер выйти, можно просто установить новое соединение и послать команду на выход.
Это достаточно низкоуровневый код, в зависимости от конкретной задачи можно библиотеки более высокого уровня использовать.
Как выключить сервер dev сервер django?
При разработке на Django запускаю сервер командой
./manage.py runserver
после выхода из PyCharm сервер не выключается, как его выключить?
- Вопрос задан более трёх лет назад
- 10173 просмотра
Комментировать
Решения вопроса 1

Settings -> Appearance & Behavior -> System Settings -> On Closing Tool Window with Running Process
Должна стоять галочка на Terminate process
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 2

В терминале ктрл + с
Ответ написан более трёх лет назад
Нравится 2 1 комментарий
DanchiEllo @DanchiEllo
На Windows 10 в терминале PyCharm работает
Где запускаете? в консоли в PyCharm или в отдельной консоли? Если запускаете в отдельной консоли — то просто Ctrl+C прервёт процесс (остановит сервер).
В самом PyCharm пользуюсь F6 чтобы запускать сервер (при выключении PyCharm — сервер убивается).