Страницы

Поиск по вопросам

Показаны сообщения с ярлыком Python. Показать все сообщения
Показаны сообщения с ярлыком Python. Показать все сообщения

пятница, 12 июля 2019 г.

Поиск ближайших объектов в списке

В общем, у меня есть файл со строками вида: ADG,AIRPORT,USA,49221,,MI,,Madison,Adrian,,W Cadmus Rd,-84.07275,41.87428,Lenawee County Airport,
ADS,AIRPORT,USA,75001,,TX,,Addison,,4699,Airport Pky,-96.83121,32.96595,Addison Airport,
ADT,AIRPORT,USA,74820,,OK,,Ada,,,Airport Rd,-96.67693,34.80222,Ada Municipal Airport, Есть функция, запрашивающая ввести широту и долготу, т.е. (-84.07275,41.87428), эти координаты - наше местоположение. Мне нужно чтобы при вводе широты и долготы печатались аэропорты по отдалению от нас. Всяко пробовал, не получается, может вы подскажете? def search(obj1, obj2): for line in file_airport: Str_file = ''.join(line).title() List_file = Str_file.split(',') List_file2 = [List_file[12:13], List_file[11:12], List_file] sorted(List_file2) if list(obj1) < List_file2[0]: for count in range(1,10): count += 1 print sorted(List_file2[0]), List_file2[2], '
' break Я пока написал то что думал для широты, но выводит не то, что нужно. При таком виде как у меня написано выводит следующее: ['42.06228'] ['Aia', 'Airport', 'Usa', '69301', '', 'Ne', '', 'Box Butte', 'Alliance', '', 'Sarpy Rd', '-102.81021', '42.06228', 'Alliance Municipal Airport', '
']
['40.11228'] ['Aid', 'Airport', 'Usa', '46017', '', 'In', '', 'Chesterfield', 'Anderson', '282', 'Airport Rd', '-85.61454', '40.11228', 'Anderson Municipal Airport', ''] Где и есть List_file2[0] - ['40.11228'] Как я понял он может не сортировать их из-за того что например, на данный момент в цикле сравнивается list(obj1) сList_file2[0], т.е. одну строку. Так ли это? И как это исправить?


Ответ

введите код здесьНа первый взгляд проблема может быть в строке sorted(List_file2) Попробуйте так: List_file2 = sorted(List_file2) или List_file2.sort() Функция sorted возвращает новый отсортированный массив, а содержимое List_file2 не меняется. Метод sort списка производит изменение содержимого объекта, у которого он был вызван. upd: Еще не понятно вот это: for count in range(1,10): count += 1 # <--- зачем? Если это счетчик, то он инкрементируется автоматически, а если нужно идти через два шага, то нужно писать for count in range(1, 10, 2) upd2: вот набросал простенький пример: http://ideone.com/wETPW

Иногда вываливается ошибка table crashed. Что это значит?

Иногда происходит такой фейл. Причем он происходит рандомно и разово, после перезагрузки страницы все ок... Что это вообще может значить? И как это исправить? Привожу текст из дебага. Caught Warning while rendering: Table './megumi/address_city' is marked as crashed and should be repaired
Request Method:
GET
Request URL:
http://megumi.jino.ru/addresses/
Django Version:
1.3.1
Exception Type:
TemplateSyntaxError
Exception Value:
Caught Warning while rendering: Table './megumi/address_city' is marked as crashed and should be repaired


Ответ

Таблица БД повреждена вследствие каких-то коллизий, как-то: базы данных выключили не как положено и т.д. Сделайте repair таблички.

Фильт по значениям в django-admin

У меня есть 2 модели: class Client(models.Model): name = models.CharField(max_length=100)
def __unicode__(self): return self.name и class Discount(models.Model): discount = models.IntegerField() client = models.ForeignKey(Client) В django-admin если создавать/редактировать конкретный экземпляр Discount, поле выбора Клиента представляет из себя длинный-длинный список, по которому очень неудобно искать. Как бы сделать этот список поудобнее, желательно с функцией ввода текста, который являлся бы фильтром по данному полю, т.е. имени клиента?


Ответ

ModelAdmin.raw_id_fields raw_id_fields is a list of fields you would like to change into an Input widget for either a ForeignKey or ManyToManyField

четверг, 11 июля 2019 г.

Поименованные аргументы из Python в с++ через SWIG

Здравствуйте. Объявляю в С++ class, ну например:
сlass Point { public: Point(int color, int x=0, int y=0); };
Теперь из Pyhton пробую создать объект
p = Point(16, y=0)
Но получаю что-то вроде:
TypeError: __init__() got an unexpected keyword argument 'y'
Как при помощи SWIG генерировать для Pyhton интерфейс с поименованными аргументами?


Ответ

Добавьте в Ваш интерфейсный файл, например point.i, следующую строку:
%feature ("kwargs") Point;

Формирование вложенных в список списков из других списков по определенным правилам?

Добрый день, есть три списка
allIndex_A = [1, 2, 8, 12, 17, 21, 23, 29] allIndex_B = [3, 5, 7, 9, 11, 13, 15, 18, 20, 22, 24, 26, 28, 30] allIndex_C = [4, 6, 10, 14, 16, 19, 25, 27]
нужно из них сделать список со вложенными списками, вот такой:
newList = [[1,3,4], [2,3,4], [8,9,10], [12,13,14], ...]
Первый элемент вложенного списка это первый это первый элемент списка allIndex_A. Второй элемент это первый элемент из списка allIndex_В, значение которого больше значения первого элемента из вложенного списка. Третий элемент это также первый найденный элемент из списка allIndex_С, значение которого больше первого элемента во вложенном списке.
Первый элемент второго вложенного списка это второй элемент из списка allIndex_A. Второй и третий элемент второго вложенного списка находятся по таким же условиям как и в первом вложенном списке. То есть это должен быть первый найденный элемент из списков allIndex_В и allIndex_С, значение которого больше значения первого элемента.
Пример получившегося списка newList выше. Начал изучать программирование недавно, многих вещей еще не знаю. Буду благодарен, если кто-то объяснит как сделать то, что мне нужно или хотя-бы даст ссылку где можно почитать на тему вопроса.


Ответ

Вот решение, основанное на использовании zip(), чтобы транспонировать элементы трёх списков
#!/usr/bin/env python from itertools import tee
def gt_first(first, iterable): """Yield items from iterable that are greater than corresponding items from first.
first, iterable are sorted. """ it = iter(iterable) x = next(it) #NOTE: wrap with try/except StopIteration for pep-479 for item in first: while not (x > item): x = next(it) yield x
allIndex_A = [1, 2, 8, 12, 17, 21, 23, 29] allIndex_B = [3, 5, 7, 9, 11, 13, 15, 18, 20, 22, 24, 26, 28, 30] allIndex_C = [4, 6, 10, 14, 16, 19, 25, 27]
a, ab, ac = tee(allIndex_A, 3) L = list(map(list, zip(a, gt_first(ab, allIndex_B), gt_first(ac, allIndex_C)))) print(L)
Результат
[[1, 3, 4], [2, 3, 4], [8, 9, 10], [12, 13, 14], [17, 18, 19], [21, 22, 25], [23, 24, 25]]
В ответе нет вложенного списка [29, 30, None], так как allIndex_C не имеет элемента большего 29 (можно itertools.zip_longest() вместо zip() использовать, чтобы подставить какое-нибудь значение, вместо игнорирования вложенного списка целиком).
Время исполнения линейное (O(n)). Если входные списки не отсортированы, то их надо отсортировать, тогда время исполнения O(n*log n) (на сортировку).

Редактирование и настройка почтовых заголовков (mail headers) в Python

Добрый день! Мне необходимо для тестирования системы периодически отправлять и получать специальные письма с различными заголовками. Для реализации этой задачи я использую smtplib и MIMEText с энкодером encode_quopri.
import smtplib from email.mime.text import MIMEText from email.encoders import encode_quopri
SERVER = 'mailserver.loc' FROM = 'sender@' + SERVER TO = 'abonent1@' + SERVER
msg = MIMEText('проверка проверка проверка', 'plain', _charset='windows-1251') msg['Subject'] = 'subject' msg['From'] = FROM msg['To'] = TO msg['X-Message-id'] = 'xmsg_id' encode_quopri(msg)
print (msg)
На выходе получаю:
Content-Type: text/plain; charset="windows-1251" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: subject From: sender@mailserver.loc To: abonent1@mailserver.loc X-Message-id: xmsg_id Content-Transfer-Encoding: quoted-printable
=EF=F0=EE=E2=E5=F0=EA=E0=20=EF=F0=EE=E2=E5=F0=EA=E0=20=EF=F0=EE=E2=E5=F0=EA= =E0
Но у меня задвоился заголовок:
Content-Transfer-Encoding: base64 ... Content-Transfer-Encoding: quoted-printable
Я попробовал удалить первый, но тогда ломается quoted-printable и результат:
7/Du4uXw6uAg7/Du4uXw6uAg7/Du4uXw6uA=3D
Моя цель получить вот такой заголовок:
Date: Wed, 1 Jun 2011 11:25:32 +0400 From: Billinfo X-Priority: 3 (Normal) Message-ID: <878185321.20110601112532> To: abonent1@mailserver.loc Subject: Just a subject Resent-from: Billinfo MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----------115EA32B5A1C2" Resent-Message-Id: <20110601072537.A8F1A3C14A> Resent-Date: Wed, 1 Jun 2011 11:25:37 +0400 (MSD)
------------115EA32B5A1C2 Content-Type: text/plain; charset=windows-1251 Content-Transfer-Encoding: quoted-printable
=EF=F0=EE=E2=E5=F0=EA=E0=20=EF=F0=EE=E2=E5=F0=EA=E0=20=EF=F0=EE=E2=E5=F0=EA= =E0 ------------115EA32B5A1C2 Content-Type: APPLICATION/VND.MS-EXCEL; name="doc.xls" Content-transfer-encoding: base64 Content-Disposition: attachment; filename="doc.xls"
some base64 content ------------115EA32B5A1C2--
Буду благодарен за любую помощь в решении моего вопроса!
UPD 11/04/2015: Моё решение:
from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.charset import Charset from email.encoders import encode_quopri
SERVER = 'mailserver.loc' FROM = 'billing@' + SERVER TO = 'abonent1@' + SERVER
msg = MIMEMultipart('mixed') msg['Subject'] = 'subject' msg['From'] = FROM msg['To'] = TO msg['X-Message-id'] = 'xmsg_id'
charset = Charset('windows-1251')
att1 = MIMEText('проверка111 проверка проверка', 'plain', _charset=None) encode_quopri(att1) att1.set_charset(charset) del att1['Content-Transfer-Encoding'] del att1['MIME-Version'] att1['Content-Transfer-Encoding'] = 'quoted-printable'
msg.attach(att1)
print (msg.as_string())
################### OUTPUT ################### # Content-Type: multipart/mixed; boundary="===============2009055196==" # MIME-Version: 1.0 # Subject: subject # From: billing@mailserver.loc # To: abonent1@mailserver.loc # X-Message-id: xmsg_id
# --===============2009055196== # Content-Type: text/plain; charset="windows-1251" # Content-Transfer-Encoding: quoted-printable
# =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0111=20=D0=BF=D1=80=D0=BE=D0= # =B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0= # =B0 # --===============2009055196==--
Благодарю за помощь! Заголовки нормально воспринимаются принимающей программой и письмо корректно обрабатывается.


Ответ

То, что вы желаете получить — составное письмо. Его составляющие: 1. текст; 2. файл-вложение.
Поэтому при формировании письма следует использовать тип MIMEMultipart, который будет играть роль оболочки для его частей (именно ему следует присваивать заголовки, которые вы присваиваете MIMEText).
Далее к оболочке нужно будет прикрепить (метод attach) объекты типов MIMEText (ваш текст), и MIMEApplication (ваш файл-вложение).

Загрузка файлов в Django

setting.py
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')
MEDIA_URL = '/media/' STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
STATIC_URL = '/static/'
форма

{% csrf_token %}
{{ form }}

views.py
def uploads(request):
if request.method == 'POST': form = upload(request.POST, request.FILES)
return HttpResponse(request.FILES['file'].temporary_file_path)
else: form = upload() return render_to_response('ff.html', {'form': form})
request.FILES['file'].temporary_file_path должен возвращать путь к временному файлу.В папке media файл отсутствует, а в браузере отображается только знак >
в модели формы только поле FileField(). При добавлении в него upload_to в консоли выдается ошибка __init__() got an unexpected keyword argument 'upload_to'


Ответ

Кратко: файл, загружаемый через форму, необходимо обработать, чего ваша программа не делает
Когда вы загружаете файл, Django сперва помещает его во временно хранилище. Маленькие файл размещаются в памяти, большие — в системной временной директории (на Linux это /tmp/).
Пример (UploadFileForm — форма, содержащая поле file типа FileField):
def upload_file(request): # Если метод POST if request.method == 'POST': # Заполняем форму полученными данными form = UploadFileForm(request.POST, request.FILES) # Если данные валидны if form.is_valid(): # обрабатываем файл handle_uploaded_file(request.FILES['file']) # перенаправляем на другую страницу return HttpResponseRedirect('/success/url/') # Если другой метод (обычно GET) else: form = UploadFileForm() # Выводим форму загрузки return render_to_response('upload.html', {'form': form})
Перенаправление делают для того, чтобы при обновлении страницы файл не загружался повторно. handle_uploaded_file — функция обработки файла, её нужно писать самому.
Пример копирования содержимого полученного файла в файл /srv/media/data.txt
def handle_uploaded_file(f): with open('/srv/media/data.txt', 'wb+') as dest: for chunk in f.chunks(): dest.write(chunk)
Нужно использовать chunks, так как копирование по частям меньше нагружает систему. Просто копирование из временной папки тоже не подходит, так как файл может быть загружен в память.
Путь, по которому будет сохраняться файл можно сформировать самому из MEDIA_ROOT и имени загруженного файла с помощью os.path.join
Обрабатывать файл можно по-разному. Можно прочитать его содержимое целиком при помощи метода read() или по частям с помощью метода chunks() и что-то с ним сделать. Но чаще всего файл просто сохраняют в какую-либо директорию, где он будет в дальнейшем хранится.
Также Django предоставляет удобный способ. Если файл также хранится в модели, то его можно сохранить в указанное место одним вызовом. Для этого в модели вы создаёте поле типа FileField с аргументом upload_to, содержащим путь, по которому будет размёщён файл. Если вы создавали форму на основе модели (то есть, с помощью ModelForm), то достаточно команды
form.save()
для сохранения файла в указанное место. Также вы сможете загружать файлы через админку.
Загрузка файлов в Django

Как добавить что угодно на русском языке в Django

Есть класс в модели
class Author(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) email = models.EmailField(blank=True, verbose_name='e-mail') def __unicode__ (self): return u'%s %s' % (self.first_name, self.last_name)
Пытаюсь добавить пользователя на русском, выдает ошибку
OperationalError at /admin/books/author/add/ (1366, "Incorrect string value: '\\xD0\\x9A\\xD0\\xBB\\xD0\\xB8...' for column 'first_name' at row 1")
Подскажите как подправить


Ответ

Нужно создать БД с кодировкой utf-8. Как именно -- смотрите документацию по своей СУБД. Для PostgreSQL: createdb -E utf-8 Исходники тоже в юникоде держать + в начале файлов прописывать # encoding: utf-8

Добавление элементов в начало списка

Есть 2 списка
in1 = [23,55,0] in2 = [100]
Нужно во второй список добавить в начало списка столько нулей, чтобы количество элементов в обоих списках стало одинаковым. К сожалению, стандартная библиотека дает возможность добавлять элементы только в конец.


Ответ

"стандартная библиотека дает возможность добавлять элементы только в конец" - это не так. list.insert() позволяет добавлять элементы в произвольные позиции.

После долгого импортирования в БД (в чистую базу успешно заливаются более 4700 записей), возникает ошибка KeyError: 'address'

Помогите пожалуйста (кто чем может) решить проблему. Парсю данные и заливаю их в БД.
### часть кода из 1го метода, который завершается формированием словаря basic_dict[self.country][city.text.lstrip()][name] = dict( detailed_url=detailed_url, place_type=self.place_type )
### тут 2ой метод, который завершается расширением первого словаря extended_dict[self.country][city][cinema].update(dict( address=street1, phone_number=phone1, official_website=website1) ) self.showtime(extended_dict)
### тут 3ий метод, который принимает расширенный словарь ### и начинает уже парсить данные и заливать в БД. def showtime(self, extended_dict): showtime_dict = extended_dict
for city in showtime_dict[self.country]: for cinema in showtime_dict[self.country][city]: url = showtime_dict[self.country][city][cinema]['detailed_url'] showtimes_tab_url = '/showtimes/#!=&cinema-section=%2Fshowtimes%2F' tree = prepare_content(url + showtimes_tab_url)
for film in tree.xpath('//div[@class="content"]'): film_name = film.xpath('.//a[@class="navi"]/text()')[0] for date in film.xpath('.//li[contains(@class,"showtimes-day sdt")]'): film_date = date.xpath('.//div[@class="date"]/text()')[0]
for time in date.xpath('.//ul[@class="showtimes-day-block"]/li'): film_time = time.xpath('string(a/text())') film_buy_ticket_url = time.xpath('string(a/@href)')
if len(film_time) == 0: film_time = None is_3d = time.find('span') film_format = ''
if film_time is not None: if is_3d is not None: film_format = '3D' else: film_format = '2D'
# IMPORT from app_places.models import Place from app_shows_and_times.models import Show, Showtime
get_showtime_place = Place.objects.get( place_name=cinema, place_street=showtime_dict[self.country][city][cinema]['address'] ) get_showtime_show = Show.objects.get(show_name = film_name)
showtime = Showtime.objects.create( showtime_dates=film_date, showtime_times=film_time, showtime_format=film_format, showtime_buy_ticket_url=film_buy_ticket_url, showtime_place=get_showtime_place, showtime_show=get_showtime_show )
Часть модели (и так уже кода много), где можно увидеть, что 2 поля идут как уникальные.
class Place(models.Model): place_name = models.CharField(max_length = 50, db_index = True) place_street = models.CharField(max_length = 80) place_phone = models.CharField(max_length = 60) place_official_site = models.URLField(max_length = 255, blank = True) place_country = models.ForeignKey(Country) place_city = models.ForeignKey(City) place_type = models.ForeignKey(PlaceType)
class Meta: db_table = 'place' unique_together = (('place_name', 'place_street'))

Traceback (most recent call last): File "", line 1, in File "/home/antonio/projects/idemvdvoem.com/idemvdvoem.com/src/shared/parser_to_db.py", line 23, in __init__ self.basic_cinemas_info() File "/home/antonio/projects/idemvdvoem.com/idemvdvoem.com/src/shared/parser_to_db.py", line 176, in basic_cinemas_info self.detailed_cinemas_info(basic_dict) File "/home/antonio/projects/idemvdvoem.com/idemvdvoem.com/src/shared/parser_to_db.py", line 225, in detailed_cinemas_info self.showtime(extended_dict) File "/home/antonio/projects/idemvdvoem.com/idemvdvoem.com/src/shared/parser_to_db.py", line 271, in showtime get_showtime_place = Place.objects.get(place_name = cinema, place_street = showtime_dict[self.country][city][cinema]['address']) KeyError: 'address'
Проблема. Запускаю класс, пошел импорт, который заканчивается KeyError: ‘address’, при том что 4700 записей в БД уже создано (базу предварительно очищаю), значит, как я понимаю, до какого-то этапа данное выражение:
get_showtime_place = Place.objects.get(place_name = cinema, place_street = showtime_dict)
работает. Но никак не могу понять, откуда возникает сбой.
Соответственно 3 вопроса:
1) Правильно ли я использую unique? Т.е. в модели задал в мета классе, а в objects.get указываю оба эти поля. Так и нужно?
2) Нужно ли для place_street = models.CharField(max_length = 80) делать db_index = True?
3) По какой причине может идти заливка в БД со ссылкой на ‘address’ в словаре, и в итоге выдавать ошибку? Как одно из предположений, возможно 4700 записи и должно быть, но я тогда не понимаю, почему процесс заканчивается ошибкой.
Простите за кучу кода.
UPD 1: Думал уже, может где-то в базе Place нету записи street. Проверил - улицы везде указаны.
UPD 2: Только лег в кровать, пришло озарение, как можно найти проблему. У меня есть модель Showtimes, которая связана через FK с Places.
1 кинотеатр с адресом ул. Лаврухина, 4. ТЦ "РайON" вообще не проимпортировался в Places.
Подумал, что может скобки. Проверил - .replace('“', "'").replace('”', "'").replace('"', "'") - не помогло. Может проблема в кириллице+латинице в названии? Может как то unique_together влияет? У меня postgreSQL
Может теперь будет кому-то легче подсказать, куда мне ковырять?


Ответ

Проблема решена. Оказалось, что при парсинге для одного кинотеатра не оказалось информации об официальном веб-сайте. Так как я проверку полей не делал, то в словарь не добавлялись данные cinema_street, cinema_phone, cinema_website для этого одного кинотеатра. Нету данных -> ошибка.
Мой код без проверки наличия данных на сайте.
for city in extended_dict[country]: for cinema in extended_dict[country][city]: url = extended_dict[country][city][cinema]['detailed_url'] tree = prepare(url)
for street in tree.xpath(".//div[@class='address']"): cinema_street = street.xpath("text()")[0].strip()
for phone in tree.xpath(".//div[@class='phone']"): cinema_phone = phone.xpath("text()")[0].replace('Телефон:', '').strip()
for website in tree.xpath(".//div[@class='website']/a"): cinema_website = website.xpath("@href")[0].strip()
extended_dict[country][city][cinema].update(dict(address = cinema_street, phone_number = cinema_phone, official_website = cinema_website))

Парсер HTML в python

Доброго времени суток!
Возникла необходимость получить данные из отчета рабочей программы, отчет в HTML.
Собственно HTML документ(Выкладываю только блок где находятся необходимые данные, если нужно дополнительно залью весь файл):
РАЗМЕРЫ:  377.000 x 77.000 mm  ПОВЕРХНОСТЬ:  29029.00 mm2  ИМЯ СВОДА ПРАВИЛ:  5P  НОМЕР ПОДПРОГРАММЫ:  SP1DOR_SHEST_BR6 / SP3DOR_SHEST_BR6  ВРЕМЯ ОБРАБОТКИ: 
Установил модуль Beautiful Soup, немного почитал документацию и написал следующий скрипт:
#!/usr/bin/env python # -*- coding: utf-8 -*- from bs4 import BeautifulSoup f = open('File1.HTML', 'rb') doc = f.read() soup = BeautifulSoup(doc) rez = [] for x in soup.find_all('font', size="2"): rez.append(x.contents[0]) if x.contents[0] == 'ВЕС: ': #Велосипед для ограничения выхода из диапазона break inp = [] for y in range(1000): if str(rez[y]) == 'НОМЕР ЧЕРТЕЖА: ': inp.append([rez[y], rez[y+1]]) print(inp)
Очень всё шатко, и ограничение по циклу, будет работать если у меня отчет на одно изделие. Идея в том, что получить данные из всех font, затем прогнать результат в цикле и найти с помощью If-ов необходимые данные, для примера допустим нужно извлечь поле "РАЗМЕРЫ: " и соответственно значение этого поля "377.000 x 77.000 mm ".

Сомнительный результат, поэтому не могли бы вы подсказать как это лучше реализовать?
Полный HTML файл(оформлен ужасно):


TruTops Laser - ПЛАН НАЛАДКИ / TruLaser 3030 (L20) - 1 / DOR_SHEST_BR6


E:/Templates/HTML/SYSTEM_Logo.gif ПЛАН НАЛАДКИ
ОБЩИЕ ПАРАМЕТРЫ 
Antonov 
25.08.2015
TruTops Laser V10.00.00











ИНФОРМАЦИЯ ОБ ОТД. ДЕТАЛИ 
НОМЕР ДЕТАЛИ: 1 
НОМЕР ЧЕРТЕЖА: 425900-92.08.101 
ИМЯ ЧЕРТЕЖА:  
ЗАКАЗЧИКА:  
КОЛИЧЕСТВО: 4 
РАЗМЕРЫ: 377.000 x 77.000 mm 
ПОВЕРХНОСТЬ: 29029.00 mm2 
ИМЯ СВОДА ПРАВИЛ: 5P 
НОМЕР ПОДПРОГРАММЫ: SP1DOR_SHEST_BR6 / SP3DOR_SHEST_BR6 
ВРЕМЯ ОБРАБОТКИ: 0.47 min (PierceLine: 0.47 min) 
ДЛИНА РЕЗКИ: 1241.13 mm 
ВЕС: 1.823 kg 
КОЛ-ВО ТОЧЕК ВРЕЗАНИЯ: 1 
ВРЕМЯ ВРЕЗАНИЯ 0.17 (PierceLine: 0.06) s 
ИМЯ ГЕОМ. ФАЙЛА: D:\Programs TRUMPF\2015\№101 Крой изделия 425901-92.00.010-10 (доп.1)\Крой ч10\425900-92.08.101.GEO 
ПРЕДВ. НАЧЕРЧ. РАЗМЕТКА:SP1DOR_SHEST_BR6 - 0.13 min
НОМЕР ДЕТАЛИ: 2 
НОМЕР ЧЕРТЕЖА: 425900-92.08.102 
ИМЯ ЧЕРТЕЖА:  
ЗАКАЗЧИКА:  
КОЛИЧЕСТВО: 4 
РАЗМЕРЫ: 264.000 x 77.000 mm 
ПОВЕРХНОСТЬ: 20328.00 mm2 
ИМЯ СВОДА ПРАВИЛ: 5P 
НОМЕР ПОДПРОГРАММЫ: SP2DOR_SHEST_BR6 / SP4DOR_SHEST_BR6 
ВРЕМЯ ОБРАБОТКИ: 0.42 min (PierceLine: 0.42 min) 
ДЛИНА РЕЗКИ: 1023.53 mm 
ВЕС: 1.277 kg 
КОЛ-ВО ТОЧЕК ВРЕЗАНИЯ: 1 
ВРЕМЯ ВРЕЗАНИЯ 0.17 (PierceLine: 0.06) s 
ИМЯ ГЕОМ. ФАЙЛА: D:\Programs TRUMPF\2015\№101 Крой изделия 425901-92.00.010-10 (доп.1)\Крой ч10\425900-92.08.102.GEO 
ПРЕДВ. НАЧЕРЧ. РАЗМЕТКА:SP2DOR_SHEST_BR6 - 0.15 min










Ответ

Можно воспользоваться тем, что все детали определены в одной таблице. В этом файле такая таблица находится однозначно с помощью поиска:
table = soup.find('table', width="600", border="1", cellspacing="1", cellpadding="0")
Далее можно выбрать все строки таблицы с помощью поиска
trs = list(table.find_all('tr'))
Для удобства итерации я преобразовал результат поиска в список. Использовал то, что поля в таблице идут в одном и том же порядке и в последовательных строках. Всего таких строк 15.
Осталась задача найти начало записи, после чего её уже разобрать. Начало записи обозначается строкой таблицы, содержащей строку 'НОМЕР ДЕТАЛИ:'. Для простоты кода я использовал цикл for, но при желании можно использовать ручную итерацию. Возможно, она будет работать немного быстрее.
Также заметил, что на странице используются неразрывные пробелы. Они имеют код \xa0. Я их преобразовываю в обычные, при желании можно их убрать, на исполнение скрипта это не влияет.
Далее разбор строк. Каждая интересующая нас строка состоит из двух элементов. Первый отвечает за имя, второй -- за значение. Пробегаюсь по всем этим строкам и сохраняю почищенные значения в кортеж.
Вот полный код скрипта:
from bs4 import BeautifulSoup
def clear_string(s): return s.replace('\xa0', ' ').strip()
def parse_detail(detail_rows): return tuple(tuple(clear_string(text) for text in row.strings) for row in detail_rows)
start_row_name = 'НОМЕР ДЕТАЛИ:' rows_count = 15
with open('File1.HTML') as in_file: soup = BeautifulSoup(in_file.read())
table = soup.find('table', width="600", border="1", cellspacing="1", cellpadding="0") trs = list(table.find_all('tr'))
details = [] for i, tr in enumerate(trs): strings = tuple(clear_string(text) for text in tr.strings) if len(strings) == 2 and strings[0] == start_row_name: details.append(parse_detail(trs[i : i + rows_count]))
print(details)
Результат работы скрипта на представленной странице:
# [(('НОМЕР ДЕТАЛИ:', '1'), # ('НОМЕР ЧЕРТЕЖА:', '425900-92.08.101'), # ('ИМЯ ЧЕРТЕЖА:', ''), # ('ЗАКАЗЧИКА:', ''), # ('КОЛИЧЕСТВО:', '4'), # ('РАЗМЕРЫ:', '377.000 x 77.000 mm'), # ('ПОВЕРХНОСТЬ:', '29029.00 mm2'), # ('ИМЯ СВОДА ПРАВИЛ:', '5P'), # ('НОМЕР ПОДПРОГРАММЫ:', 'SP1DOR_SHEST_BR6 / SP3DOR_SHEST_BR6'), # ('ВРЕМЯ ОБРАБОТКИ:', '0.47 min (PierceLine: 0.47 min)'), # ('ДЛИНА РЕЗКИ:', '1241.13 mm'), # ('ВЕС:', '1.823 kg'), # ('КОЛ-ВО ТОЧЕК ВРЕЗАНИЯ:', '1'), # ('ВРЕМЯ ВРЕЗАНИЯ', '0.17 (PierceLine: 0.06) s'), # ('ИМЯ ГЕОМ. ФАЙЛА:', # 'D:\\Programs TRUMPF\\2015\\№101 Крой изделия 425901-92.00.010-10 ' # '(доп.1)\\Крой ч10\\425900-92.08.101.GEO')), # (('НОМЕР ДЕТАЛИ:', '2'), # ('НОМЕР ЧЕРТЕЖА:', '425900-92.08.102'), # ('ИМЯ ЧЕРТЕЖА:', ''), # ('ЗАКАЗЧИКА:', ''), # ('КОЛИЧЕСТВО:', '4'), # ('РАЗМЕРЫ:', '264.000 x 77.000 mm'), # ('ПОВЕРХНОСТЬ:', '20328.00 mm2'), # ('ИМЯ СВОДА ПРАВИЛ:', '5P'), # ('НОМЕР ПОДПРОГРАММЫ:', 'SP2DOR_SHEST_BR6 / SP4DOR_SHEST_BR6'), # ('ВРЕМЯ ОБРАБОТКИ:', '0.42 min (PierceLine: 0.42 min)'), # ('ДЛИНА РЕЗКИ:', '1023.53 mm'), # ('ВЕС:', '1.277 kg'), # ('КОЛ-ВО ТОЧЕК ВРЕЗАНИЯ:', '1'), # ('ВРЕМЯ ВРЕЗАНИЯ', '0.17 (PierceLine: 0.06) s'), # ('ИМЯ ГЕОМ. ФАЙЛА:', # 'D:\\Programs TRUMPF\\2015\\№101 Крой изделия 425901-92.00.010-10 ' # '(доп.1)\\Крой ч10\\425900-92.08.102.GEO'))]

Выпадающее меню в Python (pygame)

как создать в питоне выпадающее меню с помощью графического модуля pygame? (задача, есть множество цветов и нужно выбрать один из списка)


Ответ

Попробуйте адаптировать под свои нужды вот эту библиотеку:
http://simple-pygame-menu.googlecode.com/svn/trunk/
Пример кода:
menu_data = ( 'Main', 'Item 0', 'Item 1', ( 'Things', 'Item 0', 'Item 1', 'Item 2', ( 'More Things', 'Item 0', 'Item 1', ), ), 'Quit', ) PopupMenu(menu_data) for e in pygame.event.get(): if e.type == USEREVENT and e.code == 'MENU': print 'menu event: %s.%d: %s' % (e.name,e.item_id,e.text) if (e.name,e.text) == ('Main','Quit'): quit()

Python + expect + keepass(kpcli)

Есть на баше скрипт, который создает файл с паролями keepass
#!/bin/bash url="https://10.8.0.1" pass_kp="$USER_KEE_PASS" pass_vpn="$USER_PASS" pass_z="$Z_PASS" pass_tcp="$USER_TCP_PASS" user_none="$USER" #export PATH_KEE=$USER."kdbx" echo $PATH_KEE expect <" send "rmdir Internet
" send "mkdir clickme
" send "cd clickme
" send new
expect Title: send vpn
expect Username: send none
send "$pass_vpn
" send "$pass_vpn
" expect URL: send
send

send new
expect Title: send z
expect Username: send $USER
expect Password: send "$Z_PASS
" expect "Retype to verify:" send "$Z_PASS
" expect URL: send
send

send new
expect Title: send secr_razd
expect Username: send none
expect Password: send "$USER_TCP_PASS
" expect "Retype to verify:" send "$USER_TCP_PASS
" expect URL: send
send

send new
expect Title: send translations
expect Username: send $USER
expect Password: send "$USER:$USER_ICE_PASS
" expect "Retype to verify:" send "$USER:$USER_ICE_PASS
" expect URL: send
send

send "saveas /path/kee/$PATH_KEE
" send "$pass_kp
" send "$pass_kp
" send quit
expect EOF
Который нормально создает файл file.kdbx
Решил перепиать его на Питоне
# -*- coding: utf -*- import os,sys import pexpect
url='https://10.8.0.1' path='/home/firefedot/' pass_kp='cjcfnm' pass_v='cjcfn' pass_z='cjcfnm' pass_tcp='cjcfnm' user="userus1" k=pexpect.spawn('/usr/bin/kpcli') k.sendline("rmdir eMail") k.sendline ('rmdir Internet') k.sendline ('mkdir clickme') k.sendline ('cd clickme') k.sendline ('new') k.expect ('Title:') k.sendline ('v') k.expect ('Username:') k.sendline ('none') k.sendline (pass_v) k.sendline (pass_v) k.expect ('URL:') k.sendline ('
') k.sendline ('
')
k.sendline ('new') k.expect ('Title:') k.sendline ('z') k.expect ('Username:') k.sendline (user) k.expect ('Password:') k.sendline (pass_z) k.expect ('Retype to verify:') k.sendline (pass_z) k.expect ('URL:') k.sendline (url) k.sendline ('
')
k.sendline ('new') k.expect ('Title:') k.sendline ('secr') k.expect ('Username:') k.sendline ('none') k.expect ('Password:') k.sendline (pass_tcp) k.expect ('Retype to verify:') k.sendline (pass_tcp) k.expect ('URL:') k.sendline ('
') k.sendline ('
')
k.sendline ('saveas '+path+user+'.kdbx') k.sendline (pass_kp) k.sendline (pass_kp) k.sendline ('quit') #k.interact()
os.chdir(path) print(os.getcwd()) print (os.system('ls | grep user'))
Скрипт запускается, немного думает и выдает
/home/firefedot - print(os.getcwd()) 256 - print (os.system('ls | grep user'))
То есть файл не создается, но чтото делает. проверил на Fedora 22, CentOS7, питона 2 и 3. одинаковый результат.
Думал, может прав скрипту не хватает, хоть и домашняя директория, но не помогло. Запускаю pdb он проходит по всем строчкам и тоже не показывает ничего.
Получается, что он проделывает все операции, а сохранить не может.
Где и как можно поправить?


Ответ

Вот такой код дождется закрытия kpcli и в итоге cаздаст файл.
# -*- coding: utf -*- import os,sys import pexpect
url='https://10.8.0.1' path='/home/firefedot/' pass_kp='cjcfnm' pass_v='cjcfn' pass_z='cjcfnm' pass_tcp='cjcfnm' user="userus1" k=pexpect.spawn('/usr/bin/kpcli') k.sendline("rmdir eMail") k.sendline ('rmdir Internet') k.sendline ('mkdir clickme') k.sendline ('cd clickme') k.sendline ('new') k.expect ('Title:') k.sendline ('v') k.expect ('Username:') k.sendline ('none') k.sendline (pass_v) k.sendline (pass_v) k.expect ('URL:') k.sendline ('
') k.sendline ('
')
k.sendline ('new') k.expect ('Title:') k.sendline ('z') k.expect ('Username:') k.sendline (user) k.expect ('Password:') k.sendline (pass_z) k.expect ('Retype to verify:') k.sendline (pass_z) k.expect ('URL:') k.sendline (url) k.sendline ('
')
k.sendline ('new') k.expect ('Title:') k.sendline ('secr') k.expect ('Username:') k.sendline ('none') k.expect ('Password:') k.sendline (pass_tcp) k.expect ('Retype to verify:') k.sendline (pass_tcp) k.expect ('URL:') k.sendline ('
') k.sendline ('
')
k.sendline ('saveas '+path+user+'.kdbx') k.sendline (pass_kp) k.sendline (pass_kp) time.sleep(0.6) k.sendline ('quit') k.close() # Вот эта строчка решила проблему
Спасибо за подсказку.

Создание прав по умолчанию

Требуется в приложении задать права по умолчанию. Реализовал через миграцию данных (создал пустую, и в RunPython добавил заполнение).
Но она выполняется до заполнения таблицы auth_permission. Приходится сначала применять юзерские миграции, затем всё остальное.
Как можно сделать так, чтобы она выполнялась после заполнения? Или, может быть, есть другой метод решения данной задачи?


Ответ

Вам нужно корректно заполнить свойство dependencies у класса Migration
class Migration(migrations.Migration):
dependencies = [ ('<имя_приложения>', '<имя_миграции>'), ]

Python. Поиск текста внутри окна программы

Возникла необходимость, используя Python, искать текст внутри окна программы. Причём зачастую внутри Label Box'ов.
Вот окошко из Micro-Cap, и мне, к примеру, надо найти слово Spectrum. Как такое реализовать?


Ответ

Если задача только под Windows, то вам нужны функции WinAPI FindWindow, FindWindowEx, GetWindowText, EnumChildWindows, инструмент типа Spy++ (чтобы получить информацию о классах искомых окон), а также библиотека, позволяющая вызывать эти функции (pywin32, например).
Примерный алгоритм:
Получить идентификатор (handle) окошка About по заголовку и классу окна (с помощью FindWindow). Класс окна можно узнать с помощью Spy++. Функция FindWindowEx позволяет найти окно по заголовку, классу окна, идентификатору родительского окна, идентификатору предыдущего дочернего окна родительского окна. Получить идентификаторы дочерних окон (элементов управления) окошка About (с помощью функции EnumChildWindows) С помощью функции GetWindowText получить текст дочерних окон и найти окно, содержащее искомый текст. Бонус: можно найти кнопку и послать ей с помощью функции SendMessage сообщение о том, что по ней кликнули (BM_CLICK).
Также есть специальная библиотека pywinauto для упрощения подобных задач.
Обновление
Небольшой пример. Не стал разбираться, как передать callback-функцию в EnumChildWindows, сделал свою аналогичную функцию на основе FindWindowEx:
import win32gui def enumerate_children(parent): prev = None while True: cur = win32gui.FindWindowEx(parent, prev, None, None) if not cur: return yield cur prev = cur
Тестируем (открыто окно "о программе" блокнота):
>>> import win32gui >>> wnd = win32gui.FindWindow(None, 'Блокнот: сведения') >>> wnd 3867102 >>> [win32gui.GetWindowText(item) for item in enumerate_children(wnd)] ['', '', 'Майкрософт Windows', 'Версия 10.0 (сборка 10240)', '© Корпорация Майкрософт (Microsoft Corporation), 2015 г. Все права защищены.', 'Операционная система Windows 10 Домашняя для одного языка и пользовательский интерфейс в ней защищены правами на товарные знаки и иные объекты интеллектуальной собственности в США и других странах.', '', '', 'Microsoft', 'Microsoft', 'ОК']
Скриншот окна:

Часть текста по каким-то причинам не извлеклась, но в вашем случае, думаю, проблем не будет.
Еще одно: в msdn написано, что GetWindowText не работает с элементами управления окна чужого процесса, и текст чужих элементов управления можно получить только с помощью посылки сообщения WM_GETTEXT, однако, как видим, через win32gui.GetWindowText можно получить текст чужих элементов управления. Возможно, просто внутри библиотеки pywin32 GetWindowText реализован через посылку сообщения. Но насколько я помню, особых проблем с получением текста любого окна через GetWindowText без оберток, например на Си, никогда не было.

Как правильно работать с документацией? (библиотек и самого языка)

Вызубрил теорию. Началась практика.
Обнаружилось, что документация к некоторым модулям и библиотекам неимоверно большая. К примеру рассмотрим python, tkinter. Если через help открыть модуль, то инструкция будет выдана в не вполне читабельном виде.
Как можно ускорить процесс поиска нужных методов, классов и т.п. в документах, чтобы не перерывать весь документ каждый раз строчка за строчкой? (тетрадка-ручка, волшебные сайты?)


Ответ

help фукнция использует инструмент под названием PyDoc. PyDoc умеет генерировать HTML отчеты, которые гораздо удобнее и могут быть тем что нужно. Например, в 3.5 при выполнении команды python -m pydoc -b в командной строке, запускается сервер и открывается браузер в котором собственно можно увидеть всю доступную документацию в удобном виде.
Дополнительно об этом можно почитать здесь

Не выходит сохранить formset_factory в django

В models.py
class Recipes(models.Model): name = models.CharField(max_length=200) autor = models.ForeignKey(User) date = models.DateTimeField(auto_now=True) text = models.TextField(max_length=5000)
class Products(models.Model): name = models.CharField(max_length=200) text = models.TextField(max_length=5000)
def __unicode__(self): return self.name
class ProductsInRecipes(models.Model): product = models.ForeignKey(Products) recipe = models.ForeignKey(Recipes) weight = models.PositiveIntegerField( validators=[MaxValueValidator(10000)], blank=False, null=False)
В forms.py
# -*- coding: utf-8 -*- from django import forms from recipes.models import Recipes, ProductsInRecipes
class RecipesAddForm(forms.ModelForm): class Meta: model = Recipes fields = ('name', 'text')
class ProductsInRecipesForm(forms.ModelForm): class Meta: model = ProductsInRecipes fields = ('product', 'weight')
В views.py
# -*- coding: utf-8 -*- from django.shortcuts import render_to_response, redirect from django.core.context_processors import csrf from django.template import RequestContext from django.forms.formsets import formset_factory from recipes.forms import RecipesAddForm, ProductsInRecipesForm
def add(request): args = {} args.update(csrf(request)) args['form'] = RecipesAddForm() args['form2'] = formset_factory( ProductsInRecipesForm, extra=2, max_num=30, validate_max=True) if request.POST: form = RecipesAddForm(request.POST) ProuctsFormSet = formset_factory(ProductsInRecipesForm) form2 = ProuctsFormSet(request.POST) args['form'] = form args['form2'] = form2 if form.is_valid() and form2.is_valid(): recipe = form.save(commit=False) recipe.autor = request.user recipe.save() form.save_m2m() for product in form2: product.save(commit=False) product.recipe = recipe product.save() return redirect('/ok/') return render_to_response('recipes_add.html', args, RequestContext(request)) return render_to_response('recipes_add.html', args, RequestContext(request))
И шаблон recipes_add.html
{% extends "main.html" %}
{% block content %}

{% csrf_token %} {{form}} {% for form in form2 %} {{form.product}} {{form.weight}} {% endfor %} {{form2.management_form}}

{% endblock content %}
При нажатии на submit ошибка: NOT NULL constraint failed: productsInRecipes.recipe_id
Данные из form сохраняются, а из form2 соответственно нет. Как правильно сохранить form2 или что я делаю не так?


Ответ

Если всё правильно понимаю проблема вот в этом куске кода
product.save(commit=False)
куда ты сохраняешь результат? он у тебя в воздухе весит, соответственно далее ты работаешь уже не с объектом модели, а всё с той же формой:
product.recipe = recipe product.save()
Учись правильно формировать названия переменных и не будет таких проблем:
for product_form in form2: product = product_form.save(commit=False) product.recipe = recipe product.save()

среда, 10 июля 2019 г.

Переменная не изменяет значение

Проблема заключается в том, что по идее переменная lowest должна изменять своё значение, как и highest (с ней всё получается), но почему то этого не происходит. Выставляю код вам на обозрение:
digits = [] sum = 0 lowest = 0 highest = 0
while True: digit = input('enter a number or Enter to finish: ') if digit == '': break Digit = int(digit) digits.append(Digit) sum += Digit if len(digits) == 0: lowest = Digit highest = Digit elif highest < Digit: highest = Digit elif lowest > Digit: lowest = Digit
print('numbers: ', digits) print('count =', len(digits), 'sum =', sum, 'lowest =', lowest, 'highest =', highest, 'mean =', sum/len(digits))
Вывод программы такой:
enter a number or Enter to finish: 43 enter a number or Enter to finish: 324 enter a number or Enter to finish: 2 enter a number or Enter to finish: 5 enter a number or Enter to finish: 65 enter a number or Enter to finish: 757 enter a number or Enter to finish: 33 enter a number or Enter to finish: 423 enter a number or Enter to finish: numbers: [43, 324, 2, 5, 65, 757, 33, 423] count = 8 sum = 1652 lowest = 0 highest = 757 mean = 206.5


Ответ

Условие if len(digits) == 0 у Вас не выполняется никогда, т.к. вы добавлете число еще ДО его проверки. Просто переместите digits.append(Digit) в конец цикла, и все заработает.
П.С. Если ввести отрицательное число - должно заработать и так)))
П.П.С. highest также определится неверно, если все числа - отрицательные.
Рабочий код:
digits = [] sum = 0 lowest = 0 highest = 0
while True: try: digit = input('enter a number or Enter to finish: ') except: break if digit == '': break Digit = int(digit) sum += Digit if len(digits) == 0: lowest = Digit highest = Digit elif highest < Digit: highest = Digit elif lowest > Digit: lowest = Digit digits.append(Digit)
print 'numbers: ', digits # print lowest, highest print 'count =', len(digits), 'sum =', sum, 'lowest =', lowest, 'highest =', highest, 'mean =', sum/len(digits)
Вывод консоли:
D:\Python>python test002.py enter a number or Enter to finish: 43 enter a number or Enter to finish: 324 enter a number or Enter to finish: 2 enter a number or Enter to finish: 5 enter a number or Enter to finish: 65 enter a number or Enter to finish: 757 enter a number or Enter to finish: 33 enter a number or Enter to finish: 423 enter a number or Enter to finish: numbers: [43, 324, 2, 5, 65, 757, 33, 423] count = 8 sum = 1652 lowest = 2 highest = 757 mean = 206

Django REST Framework - как заполнить шаблон данными без использования Django моделей?

Как заполнить шаблон без моделей? Использую Django REST, python 3.4, Angular JS
Предположим, есть 4 страницы в виде шаблонов: main.html, page1.html, page2.html, page3.html
На странице main отображается список, который получается из запроса к базе данных. При выборе какого-либо пункта необходимо осуществлять переход на страницу page1, и на ней отображать список, полученный также из результатов выполнения запроса к базе данных (база данных не Django), но уже с учетом выбранного на странице main пункта, т.е. передать несколько параметров в REST, заполнить шаблон page1.html результатами выполнения запроса и отобразить итоговую страницу. Далее при выборе пункта осуществлять аналогично переход на страницу page2, с нее на page3 и т.д.
Просто делать у пунктов ссылки вида /page1/type=sometype&id=1 на странице main, на page1 - /page2/type=secondtype&id=6 и т.д? Какого типа лучше использовать класс для обработки запросов - APIView? Пытаюсь использовать APIView, перехожу по ссылке вида /page1?id=1 Вот пример без type параметра, только с id
class SomeAPI(APIView): permission_classes = [permissions.AllowAny]
def get(self, request, *args, **kwargs): if (request.GET.get('id',None)): ... # result = получаю из базы данных набор записей на основе id return Response({'res':result}, template_name="page1.html")
в urls.py: url(r'^page1'), SomeAPI.as_view()
В шаблоне page1.html
... {{item}} ...
Записи возвращаются верно (т.е. с получением данных из БД проблем нет), но отображаются не в шаблоне page1.html, а на странице стандартного шаблона REST API в виде JSON-структуры
{ "res": [ { "item": "1" }, { "item": "2" }, { "item": "3" }, { "item": "4" } ] }
По сути мне нужно объединить функционал TemplateView + APIView. Можно было бы аналогично, как на странице main, из контроллера AngularJS запрашивать у APIView JSON результат методом GET, и заполнять template. Но для page1, page2, page3 нужно использовать id. Передать запросом GET его не проблема, и сформировать ответ в APIView тоже, но как передать в контроллер для страницы page1 этот id со страницы main, например? И как заполнить на основе JSON-ответа шаблон?


Ответ

Чтобы отправить словарь в шаблон, нужно использовать TemplateHTMLRenderer в параметре renderer_classes,а сам шаблон добавляется в параметр template_name
from rest_framework.renderers import TemplateHTMLRenderer from rest_framework.response import Response from rest_framework.views import APIView
class SomeAPI(APIView): renderer_classes = [TemplateHTMLRenderer] template_name = 'page1.html'
def get(self, request, *args, **kwargs): ... return Response({'res':result})
Документация по работе с шаблонами
Вообще лучше разделить бекенд и фронтенд, роутинг настроить в Angular, а REST использовать только для отправки данных.

Как получить доступ к полю JSON (python, django)

Впервые работаю с Python, буквально пару строчек кода надо написать, для работы кое-какой системы. Проблема вот в чем. Есть JSON-response от сервера, мне надо получить значение поля в нем.
[{u'message': {u'chat': {u'first_name': u'Иван', u'id': 1, u'last_name': u'Иван', u'type': u'private', u'username': u'ivan'}, u'date': 1, u'entities': [{u'length': 6, u'offset': 0, u'type': u'bot_command'}], u'from': {u'first_name': u'Иван', u'id': 1, u'last_name': u'Иван', u'username': u'Иван'}, u'message_id': 2, u'text': u'/start'}, u'update_id': 1}]
Итак, мне надо получить значение, к примеру, поля 'first_name'. Как мне его получить? Тут, я так понял, двойной список. Если бы был одинарный, то я бы мог получить значение поля first_name вот так:
response['first_name']
здесь же так не получится.


Ответ

response[0]['message']['chat']['first_name']