Использование функции asyn c запросов - html в Django представлениях - PullRequest
0 голосов
/ 25 мая 2020

Мой файл bota.py содержит код для удаления сайта электронной коммерции. Это работает, если я вызываю непосредственно в этом файле, например get_bota («мышь»), и возвращаю список очищенных данных.

import json

from requests_html import AsyncHTMLSession

asession = AsyncHTMLSession()


async def get_bota_page(keyword, page_no):
    template_link = 'https://www.bota.com.np/catalog/?_keyori=ss&from=input&page={page_no}&q={keyword}&spm=a2a0e.11779170.search.go.287d2d2bVToBsh'
    r = await asession.get(template_link.format(keyword=keyword,page_no=page_no))
    return r


def getBota(search):
    total = 1
    page = 1
    items = list()
    if search== "":
        return items
    results = asession.run(
        lambda: get_bota_page(search, 1),
        lambda: get_bota_page(search, 2),
        lambda: get_bota_page(search, 3),
    )

    print(results)
    while total != 0:
        scripts = results[page-1].html.find('script')
        jsonData = scripts[3].text.split("window.pageData=")[1]
        dictData = json.loads(jsonData)
        if (page == 1):
            total = int(dictData['mainInfo']['totalResults'])
            if total==0:
                return items

        products = dictData['mods']['listItems']
        found = len(products)
        total = total - found
        for item in products:
            temp = dict()
            temp['name'] = item['name']
            temp['productUrl'] = (item['productUrl'])
            temp['image'] = (item['image'])
            temp['price'] = (item['price'])
            temp['site'] = 'daraz'
            items.append(temp)
        page += 1
    return items

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

from .forms import Search
from .bota import getBota

def index(request):
    form = Search(request.POST or None)
    if request.method=='GET':
        return render(request, 'sites_scrap/index.html', {'form': form})
    else:
        if form.is_valid():
            keyword=form.cleaned_data['product']
            print(keyword)
            list=getBota(keyword)
            print(x)
            return render(request, 'sites_scrap/index.html', {'List': list,'form':form})

полученная мной ошибка была:

Internal Sever Error

RuntimeWarning: coroutine 'get_bota_page' was never awaited
  return [p.lower() for p in parts]

RuntimeWarning: Enable tracemalloc to get the object allocation traceback


...