Project structure:
project --yadirectapi ----models.py ----urls.py ----views.py --templates ----yandex -----index.html -----yaapi.html In the project / yadirectapi / models.py file , the βcampaignβ model is defined, and the function of requesting data via api. her, he can refer to the function get_companies .
I actually attach the project / yadirectapi / models.py code :
from django.db import models import requests, json from requests.exceptions import ConnectionError from time import sleep import sys # Create your models here. class Company(models.Model): # Id ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Id = models.IntegerField(primary_key=True) # ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Name = models.CharField(max_length=255) # ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° (Π΄ΠΎ 255 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²). ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΡΠ΅ΠΊΠ»Π°ΠΌΠΎΠ΄Π°ΡΠ΅Π»Ρ. ClientInfo = models.CharField(max_length=255) # ΠΠ°ΡΠ° Π½Π°ΡΠ°Π»Π° ΠΏΠΎΠΊΠ°Π·ΠΎΠ² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΉ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ YYYY-MM-DD. ΠΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π΄Π°ΡΡ. StartDate = models.CharField(max_length=20) # ΠΠ°ΡΠ° ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΠΏΠΎΠΊΠ°Π·ΠΎΠ² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΉ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ YYYY-MM-DD. # ΠΠΎΠΊΠ°Π·Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΉ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°ΡΡΡΡ Π² 24:00 ΠΏΠΎ ΠΌΠΎΡΠΊΠΎΠ²ΡΠΊΠΎΠΌΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° TimeZone). EndDate = models.CharField(max_length=20) # Π§Π°ΡΠΎΠ²ΠΎΠΉ ΠΏΠΎΡΡ Π² ΠΌΠ΅ΡΡΠ΅ Π½Π°Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ΅ΠΊΠ»Π°ΠΌΠΎΠ΄Π°ΡΠ΅Π»Ρ TimeZone = models.CharField(max_length=50) # ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ Π±ΡΠ΄ΠΆΠ΅ΡΠ° ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΈ. # DailyBudget = models.CharField(max_length = 255) # Π’ΠΈΠΏ ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΈ Type = models.CharField(max_length=255) # Π‘ΡΠ°ΡΡΡ ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΈ Status = models.CharField(max_length=255) # Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΈ State = models.CharField(max_length=255) # Π‘ΡΠ°ΡΡΡ ΠΎΠΏΠ»Π°ΡΡ ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΈ StatusPayment = models.CharField(max_length=255) # Π’Π΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΠ΅ ΡΡΠ°ΡΡΡΡ StatusClarification = models.CharField(max_length=255) # Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΏΠΎΠΊΠ°Π·ΠΎΠ² ΠΈ ΠΊΠ»ΠΈΠΊΠΎΠ² Statistics = models.CharField(max_length=255) # ΠΠ°Π»ΡΡΠ° ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΈ Currency = models.CharField(max_length=255) # Π€ΠΈΠ½Π°Π½ΡΠΎΠ²ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΈ Funds = models.CharField(max_length=255) # ΠΠ½Π΅Π²Π½ΠΎΠΉ Π±ΡΠ΄ΠΆΠ΅Ρ ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΈ Π² Π²Π°Π»ΡΡΠ΅ ΡΠ΅ΠΊΠ»Π°ΠΌΠΎΠ΄Π°ΡΠ΅Π»Ρ, Π£ΠΠΠΠΠΠΠΠ«Π ΠΠ 1 000 000 Amount = models.FloatField() # Π Π΅ΠΆΠΈΠΌ ΠΏΠΎΠΊΠ°Π·Π° ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΉ Mode = models.CharField(max_length=255) # ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠΊΠ°Π·ΠΎΠ² Impressions = models.FloatField() # ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ»ΠΈΠΊΠΎΠ² Clicks = models.FloatField() # Π‘ΡΠΌΠΌΠ° ΡΡΠ΅Π΄ΡΡΠ² Π·Π°ΡΠΈΡΠ»Π΅Π½Π½ΡΡ
Π½Π° Π±Π°Π»Π°Π½Ρ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π·Π° Π²ΡΠ΅ΠΌΡ Π΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ Sum = models.FloatField() # Π’Π΅ΠΊΡΡΠΈΠΉ Π±Π°Π»Π°Π½Ρ ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΈ Balance = models.FloatField() # ΠΠ΅Π½ΡΠ³ΠΈ Π·Π°ΡΡΠ°ΡΠ΅Π½Π½ΡΠ΅ Π½Π° ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΡ Π·Π° Π²ΡΡ Π²ΡΠ΅ΠΌΡ Π΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ Spend = models.FloatField() def __str__(self): return self.Name def get_companies(): if sys.version_info < (3,): def u(x): try: return x.encode("utf8") except UnicodeDecodeError: return x else: def u(x): if type(x) == type(b''): return x.decode('utf8') else: return x CampaignsURL = 'https://api-sandbox.direct.yandex.com/json/v5/campaigns' token = '' # clientLogin = '' headers = {'Authorization': 'Bearer ' + token, # 'Client-Login': clientLogin, 'Accept-Language': 'ru', } body = {'method': 'get', 'params': {'SelectionCriteria': {}, 'FieldNames': ['Id', 'Name', 'ClientInfo', 'StartDate', 'EndDate', # 'TimeTargeting', 'TimeZone', 'DailyBudget', 'Type', 'Status', 'State', 'StatusPayment', 'StatusClarification', 'Statistics', 'Currency', 'Funds', # 'Amount', # 'Mode', # 'Impressions', # 'Clicks', # 'Sum', # 'Balance', # 'Spend', ] } } jsonBody = json.dumps(body, ensure_ascii=False).encode('utf8') try: result = requests.post(CampaignsURL, jsonBody, headers=headers) if result.status_code != 200 or result.json().get("error", False): print("ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ API ΠΠΈΡΠ΅ΠΊΡΠ°.") print("ΠΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ: {}".format(result.json()["error"]["error_code"])) print("ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ: {}".format(u(result.json()["error"]["error_detail"]))) print("RequestId: {}".format(result.headers.get("RequestId", False))) else: print("RequestId: {}".format(result.headers.get("RequestId", False))) print("ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π±Π°Π»Π»Π°Ρ
: {}".format(result.headers.get("Units", False))) # ΠΡΠ²ΠΎΠ΄ ΡΠΏΠΈΡΠΊΠ° ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΉ AHTUNG!!! for campaign in result.json()["result"]["Campaigns"]: print("Π Π΅ΠΊΠ»Π°ΠΌΠ½Π°Ρ ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΡ: {} β{}".format(u(campaign['Name']), campaign['Id'])) if result.json()['result'].get('LimitedBy', False): # ΠΡΠ»ΠΈ ΠΎΡΠ²Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ LimitedBy, Π·Π½Π°ΡΠΈΡ, Π±ΡΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ Π½Π΅ Π²ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ. # Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². # ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠΎΡΡΡΠ°Π½ΠΈΡΠ½ΠΎΠΉ Π²ΡΠ±ΠΎΡΠΊΠΈ - # https://tech.yandex.ru/direct/doc/dg/best-practice/get-docpage/#page print("ΠΠΎΠ»ΡΡΠ΅Π½Ρ Π½Π΅ Π²ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ.") except requests.exceptions.ConnectionError: # Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ Π·Π°ΠΏΡΠΎΡ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ print("ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ API.") # ΠΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΊΠ°ΠΊΠ°Ρ-Π»ΠΈΠ±ΠΎ Π΄ΡΡΠ³Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ° except: # Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ print("ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° Π½Π΅ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°.") return result The synch function is defined in the project / yadirectapi / views.py synch , as well as the index and yaapi drawing functions. Here I have some concerns about the work of the synch function synch perhaps the error is somewhere in it, specifically in the update_or_create method.
I attach the project / yadirectapi / views.py file :
import sys from django.http import HttpResponseRedirect from django.shortcuts import render from .models import Company import requests, json def index(request): return render(request, 'yandex/index.html') def yaapi(request): return render(request, 'yandex/yaapi.html') def synch(request): if request.method == "POST": if sys.version_info < (3,): def u(x): try: return x.encode("utf8") except UnicodeDecodeError: return x else: def u(x): if type(x) == type(b''): return x.decode('utf8') else: return x result = Company.get_companies() for campaign in result.json()['result']['Campaigns']: company, created = Company.objects.update_or_create( Id=u(campaign['Id']), Name=u(campaign['Name']), ClientInfo=u(campaign['ClientInfo']), StartDate=u(campaign['StartDate']), EndDate=u(campaign['EndDate']), TimeZone=u(campaign['TimeZone']), Type=u(campaign['Type']), Status=u(campaign['Status']), State=u(campaign['State']), StatusPayment=u(campaign['StatusPayment']), StatusClarification=u(campaign['StatusClarification']), Statistics=u(campaign['Statistics']), Currency=u(campaign['Currency']), Funds=u(campaign['Funds']), Amount=u(campaign['DailyBudget']['Amount']), Mode=u(campaign['DailyBudget']['Mode']), Impressions=u(campaign['Statistics']['Impressions']), Clicks=u(campaign['Statistics']['Clicks']), Sum=u(campaign['Funds']['CampaignFunds']['Sum']), Balance=u(campaign['Funds']['CampaignFunds']['Balance']), Spend=u(campaign['Funds']['CampaignFunds']['Spend']), defaults={"Name": Name, "ClientInfo": ClientInfo, "StartDate": StartDate, "EndDate": EndDate, "TimeZone": TimeZone, "Type": Type, "Status": Status, "State": State, "StatusPayment": StatusPayment, "StatusClarification": StatusClarification, "Statistics": Statistics, "Currency": Currency, "Funds": Funds, "Amount": Amount, "Mode": Mode, "Impressions": Impressions, "Clicks": Clicks, "Sum": Sum, "Balance": Balance, "Spend": Spend, }) return HttpResponseRedirect('/') Well, the remaining project / yadirectapi / urls.py files :
from django.urls import path from . import views urlpatterns = [ path(r'', views.index), path(r'ya_api/', views.yaapi, name='yaapi'), path(r'synch/', views.synch), ] And the project / templates / yandex / yaapi.html file :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="POST" action={{yadirectapi.views.synch}}> {# ΠΡΠΎΠ±ΠΎΠ²Π°Π» Π΅ΡΡ Π²ΠΎΡ ΡΠ°ΠΊ: <form method="POST" action="synch/"> #} {% csrf_token %} <input type='submit' value="synch"> </form> <a href="/">index</a> </body> </html> Well, actually the console output:
[05/Nov/2018 17:27:43] "POST /ya_api/synch/ HTTP/1.1" 404 2447 Not Found: /ya_api/synch/ And the output on the website by clicking on the button:
Page not found (404) Request Method: POST Request URL: http://127.0.0.1:8000/ya_api/synch Using the URLconf defined in erpmod.urls, Django tried these URL patterns, in this order: admin/ ya_api/ [name='yaapi'] synch/ The current path, ya_api/synch, didn't match any of these.