Сократите пропускную способность загрузки страницы 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)