Как определить функцию просмотра в файле views.py в django

Я хочу создать функцию просмотра внутри файла views.py, которая запускается в определенный интервал времени, независимо от объекта запроса, что возможно в django Я делаю простой проект по сканированию веб-данных с помощью bs4 , request и django, до сих пор я могу сканировать данные и представлять их в моем django views.py.

Данные, просканированные с другого веб-сайта, имеют следующий формат

  news_title = 'were-these-remote-wild-Islands'news_url =' http://bbc.co.uk/travel/see-the-dark-side-of-climate-change  ' 

и моя функция просмотра имеет следующую строку кода

  из .bbc import bbc_crawlerfrom .models import Newsdef collect_data (request  ): '' 'объедините все новости с каждого новостного портала' '' allnews = [] #return dict obj {'title': 'изменение климата', 'url': 'http://bbc.co.uk'}  , {'title': 't', 'url': 'http://url.com'} allnews.append (bbc_crawler ()) для новостей в allnews: для каждой новости ссылка в news.items (): # Проблема  на каждый запрос  st одни и те же данные, отправленные в базу данных, необходимо решение для отправки данных через каждые 5 минут, вне зависимости от этой функции News.objects.create (title = eachnews, url = link, source = source) return render (request, '  news/index.html ', {' allnews ': allnews,' source ': source})  

Проблема с приведенным выше кодом заключается в том, что указанная выше функция просмотра запускается только тогда, когда мы посетите URL-адрес, который указывает на эту функцию просмотра, как определено в этом файле urls.py

urls.py

  из импорта django.conf.urls  urlfrom.  import viewsurlpatterns = [url (r '^ $', views.news, name = "index"),]  

Когда я обновляю этот URL, каждый раз, когда сохраняются одни и те же дублированные данные в базе данных.

Мне нужно решение запускать поисковый робот каждые 5 минут и сохранять просканированные данные в базе данных.

Где мне запускать поисковый робот в представлениях .py, чтобы я мог сохранять данные каждые 5 минут без дублирования данных и вне зависимости от объектов запроса. Я хочу сохранять просканированные данные в базе данных django каждые 5 минут.

Как это сделать, текущая проблема заключается в том, что данные сохраняются только тогда, когда мы обновляем или запрашиваем страницу.

I для сохранения данных вне зависимости от объекта запроса в базе данных


Сначала я хочу, чтобы вы переосмыслили свой дизайн

Представления сделано, чтобы дать ответ на запрос пользователя. Не для сканирования данных вам следует реализовать другую функцию, независимую от представления. Ваше представление должно отображать только последнюю запись в базе данных. Он НЕ должен сканировать данные.

Подумайте о сценарии: Пользователь1 отправляет запрос GET, он просканирует данные и сохранит их в базе данных при тике 00:01, если мы решили вашу проблему своевременного выполнения. Следующее действие должно быть в тике 00:06. Теперь, если между User2 и User3 наступает тик 00:02 и 00:03, и они отправляют запрос GET, новые данные для сканирования будут добавлены в базу данных. Предполагается, что между 00:01 и 00:06 должно быть 2 записи, но из-за User2 и 3 есть 4 записи.

Так и сделайте. Это более уместно

1. Создайте myfun.py в каталоге вашего приложения:

  из .bbc import bbc_crawlerfrom .models import News def crawl_data  (): allnews = [] allnews.append (bbc_crawler ()) для новостей в allnews: для каждой новости ссылка в news.items (): News.objects.create (title = eachnews, url = link, source = source) 

2.ПОСЛЕ запуска вашего веб-сервера явно запустите этот crawling.py только один раз

  python crawling.py  

Запишите crawling.py следующим образом:

  import timefrom myfun import crawl_data while (True): time.sleep (300) crawl_data ()   

В вашем представлении просто покажите последнюю запись в базе данных любому количеству пользователей:

  def collect_data (request);  lastentry = News.objects.all (). last () allnews = lastentry.allnews # Получить в соответствии с полями вашей модели source = lastentry.source # Получить в соответствии с полями вашей модели return render (request, 'news/index.html',  {'allnews': allnews, 'source': source})  

Просмотры предназначены для отвечая на запрос. если вам нужно выполнить сканирование с интервалом, вы должны настроить задачу сельдерея, как это предлагает @Rohit Jain — или для тривиальных вещей — в команде управления, вызываемой из cron или супервизора, сохранить данные, просканированные в базе данных, и взять их из вид.



Мой файл views.py быстро становится большим. Должен ли я его реорганизовать?

В конце концов, каждый проект Django достигает состояния, когда вы спрашиваете себя: следует ли мне пересчитать этот файл views.py?

Может быть, вы обнаружите, что случайно прыгаете в огромном файле view.py. Или это просто количество строк, которое кажется больше, чем должно быть. 500 строк — это слишком много? Как насчет 2000 года?

Вот несколько вопросов, которые вы можете задать себе, чтобы понять, стоит ли вам беспокоиться, и простой способ сделать большие файлы views.py более управляемыми.

Это действительно проблема?

Рефакторинг должен быть мотивирован реальной проблемой, с которой вы сталкиваетесь. Если вы можете без проблем перемещаться по своим представлениям, и ваша работа не испытывает отрицательного влияния, возможно, вы вы не делаете ничего плохого.

Беспокойство о количестве строк должно вас утомить, но большие файлы не обязательно плохо. Огромный файл может помочь вам определить основные существующие проблемы, которые должны быть адресовано.

Тонкие представления и толстые модели

Большой файл views.py может указывать на то, что вы делаете слишком много в своих представлениях.. Есть ли логика, которая была бы лучше в ваших моделях, менеджерах или формах?

Многоразовые части

Если есть функции, которые не являются представлениями, вы можете их извлечь в один файл вспомогательных функций и импортируйте его в свои представления. Может быть, существует даже дублированная функциональность, которую можно извлечь из ваших представлений?

Подмодуль представлений

Разделите ваш единственный файл views.py на несколько. Без необходимости изменять импорт и URL-адреса в других местах.

Довольно просто перейти от одного view.py к подмодулю.

Во-первых, вам нужно создать новый каталог рядом с вашим файлом views.py с именем views . Переместите в него файл views.py и создайте файл __ init__.py :

  views├── __init __. py└── views.py  

__ init __. py файл должен иметь следующее содержимое:

  from views import *  

На этом этапе ваше приложение будет работать должным образом, но вы можете начать разбивать части большого файла views.py на более мелкие части.

Если у вас есть представления, которые связаны друг с другом, вы можете добавить новый файл с именем topic.py и переместить их там. Папка views теперь выглядит так:

  views├── __init __. Py├── topic.py└── views.py   

Убедитесь, что ваш __ init__.py импортирует содержимое topic.py, и все готово!

  from views import * from topic import *  

Таким образом, вы можете разделить большой файл views.py на несколько файлов по их теме и Вам будет легче перемещаться по представлениям в будущем, вместо того, чтобы прокручивать растущий единственный файл views.py.

Разделение файлов на модули таким образом — хороший шаг, прежде чем вы решите создавать специальные приложения в вашем проекте.

Оцените статью
clickpad.ru
Добавить комментарий