Сократите пропускную способность загрузки страницы Django

Строим проект новостной ленты на Django. Главная страница сайта будет представлять собой две расположенные рядом друг с другом ленты новостей, состоящие из ленты twitter и ленты reddit соответственно.

Используя модуль inspect в chrome, я заметил, что загрузка страницы занимает до 5,5 секунд.

У меня есть скрипт службы, запускаемый при обновлении страницы, который выполняет api вызовы к reddit и twitter, получает данные, затем создает объект Post для этого конкретного поста/твита. Объект Post я смоделировал в models.py.

Затем я захватываю все объекты Post и передаю их через представление в качестве контекстной переменной.

В моем шаблоне я перебираю посты и вставляю необработанный html на страницу.

Каким образом я могу изменить логику/архитектуру моего проекта, чтобы страница загружалась быстрее, основываясь на текущих процедурах? Любые предложения о том, как увеличить эффективность в контексте моего проекта? Вот мой код:

services.py

import praw
import tweepy
import requests
import webbrowser
import pprint
import json
import os
import sys
import datetime
from .models import Post

# twitter
sys.path.insert(
    0, 'C:\\Users\\Nick\\Desktop\\2021 Python\\NBA_Project\\NBAblog\\news')


here = os.path.dirname(os.path.abspath(__file__))

# connect to api

def tweet_connect(key, secret, access_key, access_secret):

    auth = tweepy.OAuthHandler(key, secret)

    auth.set_access_token(access_key, access_secret)

    api = tweepy.API(auth, wait_on_rate_limit=True,
                     wait_on_rate_limit_notify=True)

    t_post_dict = {}

    # grab size count of tweets on home timeline

    my_timeline = api.home_timeline(count=10)

    current_status = []

    default = 'https://twitter.com/twitter/statuses/'

    # grab raw html of each tweet in timeline

    for status in my_timeline:
        url = default + str(status.id)
        tweet_request = requests.get(
            'https://publish.twitter.com/oembed?url=' + url + '&omit_script=true')
        tweet_json = tweet_request.json()
        tweet_html = tweet_json['html']

        # create Post object with extracted tweet data

        Post.objects.create(post_type='Twitter', root_url=url,
                            html=tweet_html)

# reddit

def reddit_connect(client_id, secret, username, password, user_agent):

    sub = 'nba'

    r_post_dict = {}

    reddit = praw.Reddit(
        client_id=client_id,
        client_secret=secret,
        username=username,
        password=password,
        user_agent=user_agent)

    id_list = []
    url_list = []

    for r in reddit.subreddit(sub).hot(limit=10):
        url = r.permalink
        headers = {
            'User-Agent': 'nba_comp app',
            'From': 'nickiscool88',
            'Accept': 'application/json'
        }

        endpoint = requests.get(
            f"https://www.reddit.com/oembed?url=https://www.reddit.com{url}", headers=headers)
        the_html = endpoint.json()['html']

        Post.objects.create(post_type='Reddit',
                            root_url=f"www.reddit.com{url}", html=the_html)

Спасибо!

views.py

def main(request):

    sys.path.insert(
        0, 'C:\\Users\\Nick\\Desktop\\2021 Python\\NBA_Project\\NBAblog\\news')

    here = os.path.dirname(os.path.abspath(__file__))
    all_posts = Post.objects.all()
    context = {'posts': all_posts,}

    return render(request, 'main.html', context)

main.html

{% extends 'base.html' %} {% block content %} {% autoescape off %}
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css"
  rel="stylesheet"
  integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6"
  crossorigin="anonymous"
/>

<div class="container">
  <div class="row">
    <div class="col-6">
      <h3 class="text-center">Twitter News</h3>
      {% for post in posts %} {% if post.post_type == 'Twitter' %}
      <div class="mdl-card__media" id="timeline">
        {{ post.html }} {% endif %}
      </div>
      <br />
      {% endfor %}
      <script
        async
        src="https://platform.twitter.com/widgets.js"
        charset="utf-8"
      ></script>
    </div>
    <div class="col-6">
      <h3 class="text-center">Reddit News</h3>
      {% for post in posts %} {% if post.post_type == 'Reddit' %}
      <div class="mdl-card__media" id="timeline">
        {{ post.html }} {% endif %}
        <br />
      </div>
      {% endfor %}
      <script
        async
        src="//embed.redditmedia.com/widgets/platform.js"
        charset="UTF-8"
      ></script>
    </div>
  </div>
</div>
{% endautoescape %}{% endblock %}

models.py

class Post(models.Model):
    # Reddit, Twitter, Youtube
    post_type = models.CharField(
        max_length=20, null=True, blank=True)
    root_url = models.CharField(max_length=200, default="")
    html = models.TextField(default="")
    created_at = models.DateTimeField(auto_now_add=True)
Вернуться на верх