Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde

: Anfänger: Erstellen Sie eine Tagebuch-API und veröffentlichen Sie sie ab dem Ausgangszustand.

Das fertige Produkt ist da. Dies ist die API, mit der ich mein Tagebuch verwalte. : joy: lol http://www.kojimaiton-philosophy.com/api/diaries/

: bleistift: Tagebuch Verwendung von REST_API

CRUD bietet die für ein Tagebuch erforderliche Mindestfunktionalität: Rakete:

Jeder kann GET erhalten, aber POST``PUT``DELETE kann von niemandem aufgerufen werden. Fügen Sie daher dem Header ein Zugriffstoken hinzu. Ersetzen Sie "XXXXXX_XXXXXX" durch das erworbene Zugriffstoken.

GET

Holen Sie sich ein Tagebuch in die Liste. Paginierung, Filter und Grenzwertversätze sind ebenfalls verfügbar.
$ curl http://localhost/api/diaries/

Holen Sie sich ein Datumstagebuch mit dem Datum als Primärschlüssel.
$ curl http://www.kojimaiton-philosophy.com/api/diaries/2016-12-19/

POST

Tragen Sie den erforderlichen Inhalt in das Tagebuch ein und erstellen Sie einen neuen. * Da das Datum der Hauptschlüssel ist, können Sie nicht zweimal dasselbe Datum veröffentlichen.
$ curl -X POST http://www.kojimaiton-philosophy.com/api/diaries/ -d "date=2017-03-25" -d "title=Tagebuch Titel" -d "body=Inhalt des Tagebuchs" -d "publishing=true" -H "Authorization: JWT XXXXXX_XXXXXX"`

PUT

Geben Sie das Datum an, das Sie im Pfad aktualisieren möchten, schreiben Sie es mit den Daten, die Sie ändern möchten, neu und aktualisieren Sie es.
$ curl -X PUT http://www.kojimaiton-philosophy.com/api/diaries/2017-03-25/ -d "date=2017-03-25" -d "title=Ändern Sie den Titel des Tagebuchs" -d "body=Tagebuch wechseln" -d "publishing=false" -H "Authorization: JWT XXXXXX_XXXXXX"

DELETE

Geben Sie das Datum an, das Sie im Pfad löschen möchten, und löschen Sie die Daten.
$ curl -X DELETE http://www.kojimaiton-philosophy.com/api/diaries/2017-03-25/ -H "Authorization: JWT XXXXXX_XXXXXX"

: earth_asia: Umwelt

CentOS: 7.3.1 Python: 3.6.0 Django: 1.10.6 Restframework: 3.6.2 MySQL: 5.7.17 Nginx: 1.11.13

: Kastanie: Einstellungen

Grundlegende Konfiguration

yum aktualisieren
$ sudo yum update -y
Git installieren
$ sudo yum install git -y
Legen Sie die erforderlichen Bibliotheken
$ sudo yum install zlib-devel bzip2 bzip2-devel readline-devel openssl-devel sqlite3 sqlite-devel gcc -y

Portbezogene Einstellungen

Schalten Sie die Firewall zum Üben aus
$ systemctl stop firewalld
Firewalld automatischer Start / Stopp
$ systemctl disable firewalld
Bestätigung von SELinux
$ getenforce
Wenn erzwungen, bearbeiten Sie unten und SELINUX=SELINUX erzwingen=Auf deaktiviert umschreiben.
$ sudo vi /etc/selinux/config
Starten Sie das Gerät nach dem Umschreiben neu, damit die Einstellungen wirksam werden
$ sudo shutdown -r now
Stellen Sie sicher, dass es deaktiviert ist
$ getenforce

Installieren Sie pyenv

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ exec $SHELL -l
Bestätigung
$ pyenv -v

Python-Installation

Version prüfen
$ pyenv install -l
Diesmal 3.6.0 Installation * Der Abschluss der Installation dauert lange
$ pyenv install 3.6.0
Bestätigung
$ pyenv versions
Standard ändern
$ pyenv global 3.6.0
Bestätigung
$ pyenv versions

Installation von Django und zu verwendenden Bibliotheken

Django Installation(python3.Pip ist standardmäßig ab 6 verfügbar)
$ pip install django
REST_Frame_Arbeitsinstallation
$ pip install djangorestframework
Filtern
$ pip install django-filter
Zugriffstoken von JWT
$ pip install djangorestframework-jwt
Salzmysql mit Django
$ pip install PyMySQL
Führen Sie Django auf dem Produktionsserver aus
$ pip install uwsgi

: seedling: Erstellen eines Django-Projekts

Erstellen Sie ein Projekt
$ django-admin startproject django_rest_framework
$ cd django_rest_framework
Der Hostname wurde korrigiert. Geben Sie die IP / Domain ein, die Sie verwenden.
$ sudo vi django_rest_framework/settings.py
ALLOWED_HOSTS = ['160.16.65.138', 'localhost', '127.0.0.1',]
manage.Starten Sie den Server in dem Verzeichnis, in dem sich die py-Datei befindet, und überprüfen Sie die Verbindung mit dem Browser. http://Domainname:Es kann bei 8000 bestätigt werden. Strg, um den Server herunterzufahren+C
$ python manage.py runserver 0.0.0.0:8000
Einstellungen bei laufendem Server.Der Debug-Modus von py ist standardmäßig auf true gesetzt. Wenn Sie die Datei bearbeiten, wird sie sofort auf dem Server angezeigt.

Überprüfen Sie die Verbindung vom Browser スクリーンショット 2017-04-16 午後7.16.13.png

: white_sun_rain_cloud: DB-Einstellungen

DB-Einstellungen auf der CentOS-Seite

Es ist einfach, SQLite zu verwenden, aber hier werden wir MySQL verwenden, das fest und universell verwendet werden kann. (Obwohl die Einstellung lang ist: Freude :)

Die Datenbank, die durch frühere Ausführung erstellt wurde.Löschen Sie sqlite3.
$ ls
db.sqlite3  diary  manage.py
$ rm db.sqlite3
MariaDB ist standardmäßig in centos7 enthalten. Löschen Sie es daher
$ sudo yum remove mariadb-libs -y
Wenn Sie eine andere Version von MySQL verwendet haben, löschen Sie diese, da diese Daten möglicherweise erhalten bleiben
$ rm -rf /var/lib/mysql/
MySQL-Repository hinzufügen
$ sudo yum -y install http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
Überprüfen Sie den installierbaren Inhalt
$ yum repolist enabled | grep "mysql.*-community.*"
Überprüfen Sie die Informationen mit dem Befehl info
$ yum info mysql-community-server
Installation
$ sudo yum -y install mysql-community-server
Versionsbestätigung
$ mysql --version
Automatischer Start
$ sudo chkconfig mysqld on
Anlaufen
$ sudo systemctl start mysqld
Überprüfen Sie das Standardkennwort
$ sudo vi /var/log/mysqld.log
Suchen Sie das folgende temporäre Kennwort in der Protokolldatei. Dieses Mal ist mein Passwort(E,Sieht aus wie irsThV0uB
2017-04-01T20:05:05.561190Z 1 [Note] A temporary password is generated for root@localhost: N4IYvEp&)6%!
Wenn Sie Folgendes tun, werden Sie nach einem Passwort gefragt. Geben Sie daher den oben gefundenen Pfad ein
$ mysql -u root -p
Wenn Sie das temporäre Kennwort nicht ändern, wird keine Verarbeitung akzeptiert. Ändern Sie es daher. Bitte beachten Sie jedoch, dass dieses Passwort nur akzeptiert wird, wenn es mindestens 8 Zeichen, Buchstaben, Zahlen und Symbole enthält.
$ ALTER USER root@localhost IDENTIFIED BY '@Mysql0001';
Beenden Sie MySQL einmal
$ exit;
Fügen Sie der folgenden Datei eine Zeile hinzu und legen Sie Japanisch fest.[mysqld]Unter dem Charakter-set-server=Utf8 hinzugefügt.
$ sudo vi /etc/my.cnf
Die Beschreibung sieht so aus ↓
[mysqld]
character-set-server=utf8
Reflektieren Sie die Einstellungen
$ sudo systemctl restart mysqld
Erstellen Sie eine Datenbank zur Verwendung mit Django
$ mysql -u root -p
Nennen wir es hier diarydb.
$ create database diarydb;
Beenden Sie nach dem Erstellen
$ exit

DB-Einstellungen auf der Django-Seite

Bearbeiten Sie settings.py $ vi django_rest_framework/settings.py

django_rest_framework/settings.py


import os
#Pymysql importieren
import pymysql

#Geändert, um MySQL zu verwenden
pymysql.install_as_MySQLdb()
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.mysql',
       #Name der Datenbank
       'NAME': 'diarydb',
       #Nutzername
       'USER': 'root',
       #Passwort
       'PASSWORD': '@Mysql0001',
       #Die IP-Adresse und der Host des Servers. Blank ist lokaler Host
        'HOST': '',
       #Hafen
       'PORT': '3306',
       'OPTIONS': {
           #Überprüfen Sie die Einschränkungen genau
           'sql_mode': 'traditional',
       },
       #Benutzer testen
        'TEST_NAME': 'auto_tests',
   }
}

Überprüfen Sie, ob Django und MySQL eine Verbindung herstellen können

Erstellen Sie eine Migrationsdatei
$ python manage.py makemigrations
Reflektieren Sie in der Datenbank basierend auf der Migrationsdatei
$ python manage.py migrate

DB-Setup abgeschlossen ... Lang: Freude:

: herb: Bearbeiten Sie das Django-Projekt

Erstellen Sie eine Tagebuch-App

$ cd django_rest_framework
$ python manage.py startapp diary

Klicken Sie hier für die aktuelle Verzeichnisstruktur. Es ist, als würde man hier nach und nach Dateien hinzufügen: Muskel:

└── django_rest_framework
    ├── diary
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── django_rest_framework
    │   ├── __init__.py
    │   ├── __pycache__
    │   │   ├── __init__.cpython-36.pyc
    │   │   ├── settings.cpython-36.pyc
    │   │   ├── urls.cpython-36.pyc
    │   │   └── wsgi.cpython-36.pyc
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── manage.py

Modell definieren

Das Modell ist eins zu eins mit der DB. Erstellen Sie models.py $ vi diary/models.py

diary/models.py


# coding: utf-8
from django.db import models
from datetime import date

class Diary(models.Model):
    date = models.DateField(default=date.today, primary_key=True)
    title = models.CharField(max_length=128)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    publishing = models.BooleanField(default=True)

Definieren Sie das erstellte "Modell" in "settings.py" $ vi django_rest_framework/settings.py

django_rest_framework/settings.py



INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #Tagebuch hinzufügen
    'diary',
]

Migrieren Sie die Datenbank erneut

$ python manage.py makemigrations
$ python manage.py migrate

Rufen Sie den Django DB-Verwaltungsbildschirm auf

Benutzer für Administrator erstellen
$ python manage.py createsuperuser
Starten Sie den Server.
$ python manage.py runserver 0.0.0.0:8000

Greifen Sie auf den Administrationsbildschirm http: // Ihre IP / Domain: 8000 / admin / zu.

スクリーンショット 2017-04-16 午後9.29.46.png

Geben Sie den zuvor in "createuperuser" erstellten "Benutzernamen" und "Passwort" ein, um den Verwaltungsbildschirm aufzurufen. Sie können auf die GUI klicken, um Modelle zu bearbeiten oder hinzuzufügen.

スクリーンショット 2017-04-16 午後9.26.57.png

Fügen Sie das zuvor hier erstellte Modell hinzu, damit es über die GUI bedient werden kann. $ vi diary/admin.py

diary/admin.py


# coding: utf-8
from django.contrib import admin
from .models import Diary


@admin.register(Diary)
class Diary(admin.ModelAdmin):
    pass

DIARY wurde dem Admin-Bildschirm hinzugefügt: Muskel: Lassen Sie uns hier ein Tagebuch zur Verwendung in der API erstellen. Diarys -> Add diary -> SAVE

スクリーンショット 2017-04-16 午後10.20.37.png

: ear_of_rice: Einführung des REST-Frameworks

REST-Framework definieren

$ vi django_rest_framework/settings.py

django_rest_framework/settings.py


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #Tagebuch hinzufügen
    'diary',
    #Framework hinzufügen
    'rest_framework',
]

Serializer definieren

Begrenzen Sie die Felder, die an die API in der Serializer-Klasse ausgegeben werden sollen $ vi diary/serializer.py

diary/serializer.py


# coding: utf-8
from rest_framework import serializers
from .models import Diary


class DiarySerializer(serializers.ModelSerializer):
    class Meta:
        model = Diary
        fields = ('date', 'title', 'body', 'publishing',)

ViewSet definieren

ViewSet ist ein Controller $ vi diary/views.py

diary/views.py


# coding: utf-8
from rest_framework import viewsets
from .models import Diary
from .serializer import DiarySerializer


class DiaryViewSet(viewsets.ModelViewSet):
    queryset = Diary.objects.all()
    serializer_class = DiarySerializer

URLs definieren

Urls ist eine URL-Router-Einstellung

Registrieren Sie das erstellte DiaryViewSet $ vi diary/urls.py

diary/urls.py


# coding: utf-8
from rest_framework import routers
from .views import DiaryViewSet

router = routers.DefaultRouter()
router.register(r'diaries', DiaryViewSet)

Einstellung des Routings, auf das von außen zugegriffen wird $ vi django_rest_framework/urls.py

django_rest_framework/urls.py


# coding: utf-8
from django.conf.urls import url, include
from django.contrib import admin
from diary.urls import router as diary_router

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/', include(diary_router.urls)),
]

Ausführen und überprüfen

Starten Sie den Server $ python manage.py runserver 0.0.0.0:8000 Mit Browser verbinden http: // Meine IP / Domain: 8000 / api / diaries / `

スクリーンショット 2017-04-18 4.19.31.png

Wenn ich es mit Curl treffe, wird json zurückgegeben.

$ curl http://160.16.65.138:8000/api/diaries/
[{"date":"2017-04-15","title":"Titelprüfung","body":"Inhaltsprüfung","publishing":true},{"date":"2017-04-16","title":"Titel","body":"Inhalt!","publishing":true}]

Es ist wichtig zu beachten, dass die Zeichen verstümmelt sind, wenn sie mit json aus dem Pulldown-Menü mit der Schaltfläche neben "GET" im obigen Bild angezeigt werden. : Schrei: Abhängig von der Chrome-Version wird es möglicherweise nicht verstümmelt, aber es wird automatisch in "UTF-8" konvertiert. Wenn Sie es betrachten, ohne in Safari usw. "UTF-8" anzugeben, scheinen die Zeichen verstümmelt zu sein. Um Folgendes zu beheben, müssen Sie hier "UTF-8" angeben, damit "json" an den Client zurückgegeben wird.

スクリーンショット 2017-04-19 3.23.12.png

Geben Sie json als utf-8 an

In der Dokumentation zum REST Framework heißt es standardmäßig UTF-8: joy: $ vi diary/renderers.py Erstellen einer UTF8CharsetJSONRenderer-Klasse mit UTF-8 Der Standardwert für "rest_framework.renderers.JSONRenderer" scheint "UTF-8" zu sein, aber ich konnte nicht. .. ..

diary/renderers.py


from rest_framework.renderers import JSONRenderer


class UTF8CharsetJSONRenderer(JSONRenderer):
    charset = 'utf-8'

Fügen Sie Folgendes zu settings.py hinzu $ vi django_rest_framework/settings.py

django_rest_framework/settings.py



REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'diary.renderers.UTF8CharsetJSONRenderer',
    )
}

Verstümmelte Charaktere behoben: Muskel:

スクリーンショット 2017-04-19 3.21.25.png

: palm_tree: Überprüfen Sie CURD

Ändern Sie den IP-Speicherort in Ihren eigenen und fordern Sie Folgendes an: point_up:

POST(Create)

Erstelle neu
$ curl -X POST http://160.16.65.138:8000/api/diaries/ -d "date=2017-04-22" -d "title=Tagebuch Titel" -d "body=POST-Test" -d "publishing=true"

PUT(Update)

aktualisieren
$ curl -X PUT http://160.16.65.138:8000/api/diaries/2017-04-22/ -d "date=2017-04-22" -d "title=Ändern Sie den Titel des Tagebuchs" -d "body=PUT-Test" -d "publishing=false"

GET(Read)

Liste abrufen
$ curl http://160.16.65.138:8000/api/diaries/
Holen Sie sich bis zum Datum
$ curl http://160.16.65.138:8000/api/diaries/2017-04-22/

DELETE(Delete)

Löschen
$ curl -X DELETE http://160.16.65.138:8000/api/diaries/2017-04-22/

: Datum: Pagenation

Pagenation hinzufügen $ vi django_rest_framework/settings.py

django_rest_framework/settings.py


REST_FRAMEWORK = {
    #hinzufügen
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 3,
    'DEFAULT_RENDERER_CLASSES': (
        'diary.renderers.UTF8CharsetJSONRenderer',
    )
}

Wenn Sie es erhalten, werden "next" und "previous" zum Stammverzeichnis von json hinzugefügt, und Sie können den vorherigen und nächsten Seiten folgen. $ curl http://160.16.65.138:8000/api/diaries/

{
    count: 4,
    next: "http://160.16.65.138:8000/api/diaries/?limit=3&offset=3",
    previous: null,
    results: [
        {
            date: "2017-04-15",
            title: "Titelprüfung",
            body: "Inhaltsprüfung",
            publishing: true
        },
        {
            date: "2017-04-16",
            title: "Titel",
            body: "Inhalt!",
            publishing: true
        },
        {
            date: "2017-04-21",
            title: "hoge",
            body: "ssss",
            publishing: true
        }
    ]
}

: spider_web: filter

Bearbeiten Sie views.py $ vi diary/views.py

diary/views.py


# coding: utf-8
from rest_framework import viewsets
from .models import Diary
from .serializer import DiarySerializer


class DiaryViewSet(viewsets.ModelViewSet):
    queryset = Diary.objects.all()
    serializer_class = DiarySerializer
    #Filter hinzufügen
    filter_fields = ('publishing',)

Bearbeiten Sie settings.py $ vi django_rest_framework/settings.py

django_rest_framework/settings.py


REST_FRAMEWORK = {
    #Filter hinzufügen
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
    #Seitennation hinzufügen
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 3,
    'DEFAULT_RENDERER_CLASSES': (
        'diary.renderers.UTF8CharsetJSONRenderer',
    )
}

Versuchen Sie, das öffentliche Flag nur nach "false" zu filtern. Fügen Sie der Anforderung "Publishing = false" hinzu

$ curl http://160.16.65.138:8000/api/diaries/?publing=false

{
    count: 1,
    next: null,
    previous: null,
    results: [
        {
            date: "2017-04-22",
            title: "hogehoge",
            body: "hoge",
            publishing: false
        }
    ]
}

: boy_tone1: Authentifizierung

Es gibt verschiedene Authentifizierungsmethoden, aber dieses Mal habe ich JWT (Json Web Token) verwendet.

Bearbeiten Sie settings.py $ vi django_rest_framework/settings.py

django_rest_framework/settings.py


REST_FRAMEWORK = {
    #Hinzufügung der JWT-Zertifizierung
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
    'NON_FIELD_ERRORS_KEY': 'detail',
    'TEST_REQUEST_DEFAULT_FORMAT': 'json',
    #Filter hinzufügen
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
    #Seitennation hinzufügen
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 3,
    'DEFAULT_RENDERER_CLASSES': (
        'diary.renderers.UTF8CharsetJSONRenderer',
    )
}

#Hinzufügung der JWT-Zertifizierung
JWT_AUTH = {
    #Versuchen Sie hier, den Token-Ablauf ungültig zu machen
    'JWT_VERIFY_EXPIRATION': False,
}

Bearbeiten Sie urls.py $ vi django_rest_framework/urls.py

django_rest_framework/urls.py


# coding: utf-8
from django.conf.urls import url, include
from django.contrib import admin
from diary.urls import router as diary_router
#Authentifizierung hinzufügen
from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/', include(diary_router.urls)),
    #Authentifizierung hinzufügen
    url(r'^api-auth/', obtain_jwt_token),
]

JWT-Zugriffstoken erhalten

Anfrage mit Benutzername und Passwort des von createduperuser erstellten admin Benutzers

$ curl http://160.16.65.138:8000/api-auth/ -d "username=XXXXXXX&password=XXXXXXXX"

Bei Erfolg wird "Token" in die Antwort aufgenommen.

{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoyLCJlbWFpbCI6Im11dS5rb2ppbWEudGVzdEBnbWFpbC5jb20iLCJ1c2VybmFtZSI6ImRqYW5nbyIsImV4cCI6MTQ5Mjg1NTMxMH0.m07BcTiAkA79HZ0BC8BsgYOA-SbqmC5GMN5g_QBizZw"}

Wenn der Benutzername und das Kennwort unterschiedlich sind, schlägt dies wie folgt fehl

{"detail":["Unable to login with provided credentials."]}

Bearbeiten Sie views.py und authentifizieren Sie sich $ vi diary/views.py

diary/views.py


# coding: utf-8
from rest_framework import viewsets
from .models import Diary
from .serializer import DiarySerializer
#Authentifizierung hinzufügen
from rest_framework import permissions


class DiaryViewSet(viewsets.ModelViewSet):
    queryset = Diary.objects.all()
    serializer_class = DiarySerializer
    #Filter hinzufügen
    filter_fields = ('publishing',)
    #Hinzufügen der Authentifizierung Wenn Sie alle CURD authentifizieren möchten(permissions.IsAuthenticated,)Zu
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

Versuchen Sie, sich authentifizieren zu lassen

Erstelle neu

$ curl -X POST http://160.16.65.138:8000/api/diaries/ -d" date = 2017-04-21 "-d" title = Authentifizierung "-d" body = Test der Authentifizierung "-d" Publishing = true " `

Da es kein Zugriffstoken gibt, ist es in Ordnung, wenn es wie folgt fehlschlägt!

{"detail":"Authentication credentials were not provided."}

POST mit dem erworbenen Zugriffstoken * Ändern Sie das Zugriffstoken in Ihr eigenes

$ curl -X POST http://160.16.65.138:8000/api/diaries/ -d "date=2017-04-10" -d "title=Authentifizierung" -d "body=Authentifizierungのテスト" -d "publishing=true" -H "Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoyLCJlbWFpbCI6Im11dS5rb2ppbWEudGVzdEBnbWFpbC5jb20iLCJ1c2VybmFtZSI6ImRqYW5nbyIsImV4cCI6MTQ5Mjg1NTMxMH0.m07BcTiAkA79HZ0BC8BsgYOA-SbqmC5GMN5g_QBizZw"

Stellen Sie nach der Erstellung sicher, dass alles außer "GET" authentifiziert ist: Faust:

404 Seite auf normal behoben.

Beim Zugriff auf die aktuelle Route verwendet Django standardmäßig Folgendes: http://160.16.65.138:8000/

スクリーンショット 2017-04-22 19.51.16.png

Bearbeiten Sie settings.py und setzen Sie DEBUG = False gemäß dem Wortlaut unten. * Wenn Sie DEBUG = False festlegen, können die Dateiänderungen beim Starten des Servers nicht automatisch übernommen werden. Also sei vorsichtig You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.

$ vi django_rest_framework/settings.py

django_rest_framework/settings.py



...Kürzung

# DEBUG =Bei der Einstellung "Falsch" handelt es sich um eine normale 404-Seite.
DEBUG = False

...Kürzung

Als ich darauf zugegriffen habe, wurde es eine normale 404-Seite!

スクリーンショット 2017-04-22 19.57.24.png

: Roboter: Testfall

tests.Entfernen Sie py
$ rm diary/tests.py
Erstellen Sie ein Testverzeichnis. Stellen Sie den Test hier
$ mkdir diary/tests
Als Python-Verzeichnis zu erkennen`__init__.py`Hinzufügen. Es wird nichts Besonderes beschrieben.
$ vi diary/tests/__init__.py

Erstellen Sie "test_diary.py" für die Authentifizierung und CRUD-Tests

$ vi diary/tests/test_diary.py

diary/tests/test_diary.py


# coding: utf-8
from rest_framework import status
from rest_framework.test import APITestCase
from rest_framework_jwt.compat import get_user_model
from rest_framework_jwt.settings import api_settings


class DiaryTest(APITestCase):
    def setUp(self):
        #Ausgabe des Zugriffstokens
        User = get_user_model()
        self.username = 'test_user'
        self.email = '[email protected]'
        self.user = User.objects.create_user(self.username, self.email)
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
        payload = jwt_payload_handler(self.user)
        token = jwt_encode_handler(payload)
        self.auth = 'JWT {0}'.format(token)
        self.url = '/api/diaries/'

    def test_diary_api(self):
        # POST
        data = {
            "date": "2011-11-11",
            "title": "title",
            "body": "body",
            "publishing": True,
        }
        response = self.client.post(self.url, data, HTTP_AUTHORIZATION=self.auth)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(response.data, data)

        # GET
        expected_get_data = {
            "count": 1,
            "next": None,
            "previous": None,
            "results": [
                {
                    "date": "2011-11-11",
                    "title": "title",
                    "body": "body",
                    "publishing": True,
                }
            ]
        }
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data, expected_get_data)

        # PUT
        data2 = {
            "date": "2010-10-10",
            "title": "title",
            "body": "body",
            "publishing": False,
        }
        response = self.client.put(self.url + '2011-11-11/', data2, HTTP_AUTHORIZATION=self.auth)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data, data2)

        # DELETE
        response = self.client.delete(self.url + '2010-10-10/', HTTP_AUTHORIZATION=self.auth)
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

Führen Sie den Test aus

Im Folgenden wird test_xxxx.py in tests ausgeführt. $ ./manage.py test

Der Test ist bestanden!


[xxxxx@tk2-208-13884 django_rest_framework]$ ./manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.049s

OK
Destroying test database for alias 'default'...

: mailbox_with_mail: Proxy-Einstellungen umkehren (löschen: 8000 auf API-Endpunkt)

Nginx-Installation

Erstellen Sie eine Datei mit nginx.repo, um ein Repository hinzuzufügen $ sudo vi /etc/yum.repos.d/nginx.repo

nginx.repo


[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

Installieren und starten

Installieren Sie nginx
$ sudo yum install nginx -y
Version prüfen
$ nginx -v
Automatische Starteinstellung
$ sudo systemctl enable nginx
Anlaufen
$ sudo systemctl start nginx

Überprüfen Sie die Standardseite

Überprüfen Sie die Anzeige. http: // IP meines Servers / Unten ist mein Beispiel. http://160.16.65.138/

スクリーンショット 2017-04-22 20.47.25.png

Richten Sie einen Reverse-Proxy ein

Erstellen Sie unter /etc/nginx/conf.d eine Datei mit dem Namen XXX.conf Hier heißt es server.conf und die unter Nummer 80 empfangene Anfrage wird an Nummer 8000 weitergeleitet. $ sudo vi /etc/nginx/conf.d/server.conf

server.conf


server {
     listen 80;
     #Eine zugängliche IP-Adresse oder Domain. Unten ist mein Beispiel
     server_name 160.16.65.138;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header Host $http_host;
     proxy_redirect off;
     proxy_max_temp_file_size 0;
     location / {
        #Weiterleitungsziel
        proxy_pass http://localhost:8000;
     }:joy:
}

Starten Sie nginx neu, um die Einstellungen wiederzugeben

$ sudo systemctl restart nginx

Bei der Ausführung ist der Zugriff über den Browser mit dem Standard-HTTP "80" möglich, sodass "8000" nicht erforderlich ist. python manage.py runserver 0.0.0.0:8000

スクリーンショット 2017-04-22 21.09.22.png

: camping: Starten Sie Django mit einem Daemon und führen Sie ihn in der Produktion aus

Versuchen Sie, es im Hintergrund laufen zu lassen, auch wenn Sie den Server verlassen.

Legen Sie ein Passwort für den Stamm fest
$ sudo passwd root
Werde die Wurzel
$ su
Führen Sie Django auf einem Produktionsdämon aus
$ uwsgi --http :8000 --module django_rest_framework.wsgi --daemonize /var/log/uwsgi-django.log

Jetzt sollte es im Hintergrund laufen! Um zu verhindern, dass "uwsgi" im Hintergrund ausgeführt wird, "töten" Sie die "PID" des laufenden Servers.

Rausfinden $ netstat -ntlp

Es wird neben "uwsgi" angezeigt, aber da es "PID" ist, In diesem Fall stoppt kill -9 32215 den Server.

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      32181/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      861/sshd
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      32215/uwsgi
tcp        0      0 127.0.0.1:43047         0.0.0.0:*               LISTEN      32215/uwsgi
tcp6       0      0 :::22                   :::*                    LISTEN      861/sshd
tcp6       0      0 :::3306                 :::*                    LISTEN      19382/mysqld

Wie man "uwsgi" liest, scheint Whisky zu sein? Ich las "Uesugi": Freude:

: cat: Zusammenfassung

Legen Sie das fertige Produkt auf Github: Glühbirne:

https://github.com/MuuKojima/django_rest_framework

Dies ist die API, mit der ich mein Tagebuch verwalte. : joy: lol

http://www.kojimaiton-philosophy.com/api/diaries/ Während wir expandieren, werden wir ein Leben lang weiter operieren: Muskel: Dies wird auf AWS betrieben!

Referenz

http://qiita.com/redamoon/items/eabaacabb5b1a0c34ca3 http://qiita.com/seizans/items/05a909960820dd92a80a http://racchai.hatenablog.com/entry/2016/05/08/070000 http://var.blog.jp/archives/70125676.html

Recommended Posts

Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Rufen Sie die API mit python3 auf.
Klicken Sie mit Python auf die Etherpad-Lite-API
Führen Sie Jupyter mit der REST-API aus, um Python-Code zu extrahieren und zu speichern
Rubyist hat versucht, eine einfache API mit Python + Flasche + MySQL zu erstellen
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Implementierung von CRUD mithilfe der REST-API mit Python + Django Rest Framework + igGrid
[Version September 2020] Erläutert das Verfahren zur Verwendung der Google Mail-API mit Python
Erstellen Sie mit Python3 + Falcon eine REST-API, die die aktuelle Uhrzeit zurückgibt
Hochladen und Herunterladen von Bildern in Azure Storage. Mit Python + Anfragen + REST API
So senden Sie eine Anfrage mit Python an die DMM (FANZA) -API
Machen Sie die Python-Konsole mit UNKO bedeckt
Fraktal zum Erstellen und Spielen mit Python
Erstellen Sie ein Webframework mit Python! (1)
Erstellen Sie ein Webframework mit Python! (2)
Der Weg zum Kompilieren zu Python 3 mit Thrift
[Python] Um mit Python zu beginnen, müssen Sie zunächst sicherstellen, dass Sie Python ordnungsgemäß verwenden können.
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Der einfachste Weg, um Stimme mit Python zu synthetisieren
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Einführung in Tornado (1): Python Web Framework mit Tornado gestartet
Geben Sie die ausführbare Python-Datei an, die mit virtualenv verwendet werden soll
Ich möchte ein Spiel mit Python machen
Begrüßen Sie die Welt mit Python mit IntelliJ
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Der einfachste Weg, OpenCV mit Python zu verwenden
Verwenden Sie das Python-Framework "cocotb", um Verilog zu testen.
Einführung in Python mit Atom (unterwegs)
Versuchen Sie, mit Python eine Diedergruppe zu bilden
[Einführung in die Udemy Python3 + -Anwendung] 9. Drucken Sie zunächst mit print
Wissensnotizen erforderlich, um das Python-Framework zu verstehen
[Python] Erwähnen Sie mit der Slack-API mehrere Personen
Erstellen wir es, indem wir den Protokollpuffer mit Serverless Framework auf die API anwenden.
So generieren Sie automatisch ein API-Dokument mit dem Django REST-Framework und POST vom Dokumentbildschirm
Hinweis: So erhalten Sie den letzten Tag des Monats mit Python (hinzugefügt am ersten Tag des Monats)
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework
So senden Sie automatisch E-Mails mit Anhängen mithilfe der Google Mail-API in Python
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
[Einführung in Python] Wie iteriere ich mit der Bereichsfunktion?
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
[Python] So legen Sie den Download-Speicherort mit youtube-dl fest
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Versuchen Sie, mit MVC eine RESTful-API mit Flask 1.0.2 zu erstellen
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Konvertieren Sie das Bild in .zip mit Python in PDF
Wenn Sie mit dem Django REST-Framework filtern möchten
Ich möchte mit Python-Datenklasse nach hinten erben
Der erste Schritt, um Blender von Python verfügbar zu machen
Geben Sie MinGW als den in Python verwendeten Compiler an
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
[Python] So schreiben Sie den Tabellenstil mit python-pptx um [python-pptx]