Das fertige Produkt ist da. Dies ist die API, mit der ich mein Tagebuch verwalte. : joy: lol http://www.kojimaiton-philosophy.com/api/diaries/
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"
CentOS: 7.3.1 Python: 3.6.0 Django: 1.10.6 Restframework: 3.6.2 MySQL: 5.7.17 Nginx: 1.11.13
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
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
$ 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
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
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
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
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
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:
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
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.
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.
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
$ 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',
]
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 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 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)),
]
Starten Sie den Server
$ python manage.py runserver 0.0.0.0:8000
Mit Browser verbinden
http: // Meine IP / Domain: 8000 / api / diaries / `
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.
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:
Ä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/
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
}
]
}
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
}
]
}
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),
]
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,)
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:
permissions.IsAuthenticatedOrReadOnly
. Wenn Sie alsoOrReadOnly
nehmen, wird GET
ebenfalls authentifiziert.Beim Zugriff auf die aktuelle Route verwendet Django standardmäßig Folgendes: http://160.16.65.138:8000/
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!
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)
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'...
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 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 Anzeige. http: // IP meines Servers /
Unten ist mein Beispiel.
http://160.16.65.138/
index.html
oben ist / usr / share / nginx / html / index.html
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
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:
https://github.com/MuuKojima/django_rest_framework
http://www.kojimaiton-philosophy.com/api/diaries/ Während wir expandieren, werden wir ein Leben lang weiter operieren: Muskel: Dies wird auf AWS betrieben!
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