[PYTHON] Un client de publication Twitter stérile qui ne sauvegarde que vos tweets

Enregistrez uniquement vos tweets

Après tout, je ne sais pas à quoi l'utiliser, mais je pense que jouer avec l'API Twitter est la meilleure solution pour améliorer la compréhension des modèles de formulaires de Django. Ou plutôt, ne dites pas combien de fois vous jouez avec l'API Twitter. J'ai des symptômes subjectifs.

Créer un projet Django

Puisque Python 3.6 est supposé, la création d'un environnement virtuel est facile.

$ python3 -m venv pyworks
$ ls pyworks/
$ . pyworks/bin/activate

Continuons en supposant que Django est déjà installé.

(pyworks)$ pip install requests requests_oauthlib
(pyworks)$ cd pyworks
(pyworks)$ django-admin startproject tweetsave
(pyworks)$ cd tweetsave
(pyworks)$ python manage.py startapp myapp

Il est prêt pour le moment, mais veuillez obtenir la clé, etc. de l'API Twitter.

Modification de divers fichiers de base

Ajoutez (remplacez) la dernière ligne de settings.py comme suit. En ce qui concerne les médias, il est plus facile d'écrire à ce sujet plus tard, donc vous pouvez l'ignorer cette fois. Je me demande si je devrais écrire uniquement la partie du fichier statique.

settings.py


LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
USE_I18N = True
USE_L10N = True
USE_TZ = True


STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Il en va de même pour urls.py, qui est écrit de manière redondante, mais je pense que je vais l'écrire parce que "la gestion des fichiers multimédias" peut être effectuée à l'avenir.

urls.py


from django.conf import settings
from django.conf.urls import url, include
from django.conf.urls.static import static
from django.contrib import admin

urlpatterns = [
    url(r'^myapp/', include('myapp.urls',namespace='myapp')),
    url(r'^admin/', admin.site.urls),
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

Étant donné que urls.py n'existe pas dans myapp /, créez-en un nouveau.

myapp/url.py


from django.conf.urls import url
from . import views


urlpatterns = [
    url(r'^', views.index, name='index'),
]

Définition du modèle

Cette fois, je viens de sauvegarder mes tweets dans la base de données, donc c'est simple.

myapp/models.py


from django.db import models

class MyTweet(models.Model):
    tweet_words = models.CharField(max_length=140)
    created_at = models.DateTimeField(auto_now_add=True)

Comme c'est un gros problème, je l'écrirai également pour l'écran de gestion.

myapp/admin.py


from django.contrib import admin
from .models import MyTweet

class MyTweetAdmin(admin.ModelAdmin):
    list_display = ('id','tweet_words','created_at')

admin.site.register(MyTweet,MyTweetAdmin)

Création de formulaire

Ce n'est pas grave si vous n'utilisez pas Django Form, mais écrivons le formulaire. Il générera un formulaire très simple sans aucune description facultative, c'est donc tout.

.myapp/forms.py


from django import forms
from myapp.models import MyTweet


class TweetForm(forms.ModelForm):

    class Meta:
        model = MyTweet
        fields = ('tweet_words',)
        widgets = {
            'tweet_words': forms.Textarea()
        }

Ecrire une vue

Quoi que je dise moi-même, c'est très redondant.

myapp/views.py


from django.http.response import HttpResponse
from django.shortcuts import render, redirect
from django import forms
from myapp.models import MyTweet
from myapp.forms import TweetForm

from requests_oauthlib import OAuth1Session
import requests
import json

C_KEY = '++++++++++++++++++++++++++++++++'
C_SECRET = '++++++++++++++++++++++++++++++++'
A_KEY = '++++++++++++++++++++++++++++++++'
A_SECRET = '++++++++++++++++++++++++++++++++'

Post_API = 'https://api.twitter.com/1.1/statuses/update.json'

tw = OAuth1Session(C_KEY,C_SECRET,A_KEY,A_SECRET)

def index(request):
    form = TweetForm(request.POST or None)

    msg = request.POST.get('tweet_words')
    url = Post_API
    params = {'status': msg,'lang': 'ja'}
    req = tw.post(url, params = params)

    if request.method == 'POST':
        if form.is_valid():
            if req.status_code == 200:
                timeline = json.loads(req.text)
                form.save()
                return redirect('myapp:index')

            else:
                contexts = {
                    'Error_message': 'API restreinte',
                    }
                return render(request, 'myapp/index.html', contexts)

            return redirect('myapp:index')

    result_text = MyTweet.objects.all().order_by('-id')
    contexts = {
        'form':form,
        'result_text':result_text,
    }
    return render(request, 'myapp/index.html', contexts)

Rédiger un modèle

Vérifiez le répertoire de fichiers statiques avant.

スクリーンショット 2017-05-16 11.46.10.png

Placez le fichier de modèle dans myapp / templates / myapp /. De même pour CSS et JS, Placez-le comme myapp / static / myapp / css ~ etc.

Si vous avez plusieurs applications dans le même projet, vous ne pouvez pas les trouver en raison de conflits de noms! C'est pour éviter.

myapp/base.html


<!DOCTYPE html>
	<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1">
    {% load static %}
    <link rel="stylesheet" href="{% static 'myapp/css/style.css' %}" >
    <link rel="stylesheet" href="{% static 'myapp/css/bootstrap.min.css' %}">
	</head>
	<body>
		{% block body %}
		{% endblock %}
	</body>
</html>

myapp/index.html


{% extends 'myapp/base.html' %}
{% block body %}
<div class="container">
  <div class="row">
    <div class="col-md-12">
      <div class="col-md-4">
        <form action="{% url 'myapp:index' %}" method="post">
            <div class="row">
              {% for field in form %}
              <label>{{ field.label_tag }}</label>
              <label>{{ field }}</label>
              {% endfor %}
              <input type="submit" class="btn btn-primary" value="Envoyer">
              {% csrf_token %}
            </div>
        </form>
      </div>
      <div class="col-md-8">
        {% include "myapp/result.html" %}
      </div>
    </div>
  </div>
</div>
{% endblock %}

myapp/result.html


{% block body %}
<ul class="row">
  {% for i in result_text %}
  <li class="box clearfix">
    <dl>
      <dt> {{ i.created_at }}</dt>
      <dd>{{ i.tweet_words }}</dd>
    </dl>
  </li>
  {% endfor %}
</ul>
{% endblock %}

migrations / migrate

Je ferai le promis.

(pyworks)$ python manage.py makemigrations myapp
(pyworks)$ python manage.py migrate

Si nécessaire

(pyworks)$ python manage.py createsuperuser

Exécuter

runserver et exécutez.

スクリーンショット 2017-05-16 11.51.18.png

Quelle application stérile est née.

Recommended Posts

Un client de publication Twitter stérile qui ne sauvegarde que vos tweets
J'ai essayé de créer un système qui ne récupère que les tweets supprimés
Recevez uniquement des tweets d'images sur Twitter
[Python] J'ai créé un bot Twitter qui génère des tweets semblables à des amis avec des règles de chaîne de Markov.
Exécutez avec un navigateur. Client Twitter réalisé avec une bouteille (POST uniquement
Votre propre client Twitter réalisé avec Django
Créez un bot qui stimule les tendances Twitter