Categorías
Python

Regresión logística en Python

 

Tabla de Contenidos configuración

  • DRF
  • REST Estructura
  • DRF rápida StartModel SerializerUpdate ViewsUpdate URLsTest
  • Modelo Serializador
  • Actualizar vistas
  • actualización URL
  • prueba
  • Refactor para RESTGETDatetime FormatPOSTAuthor FormatDelete
  • GET
  • de fecha y hora Formato
  • POSTAL
  • Autor Formato
  • Eliminar
  • Conclusión y próximos pasos
  • Modelo serializador
  • Actualizar vistas
  • actualización URL
  • prueba
  • GET
  • de fecha y hora Formato
  • POSTAL
  • Autor Formato
  • Eliminar mirada

Vamos a la manera de crear una API REST para nuestro proyecto Talk Django Django usando Resto Marco (DRF), que es una aplicación utilizada para crear rápidamente las API REST basados ​​en modelos de Django.

Dicho de otra manera, vamos a convertir una aplicación no reparador en uno REST con DRF. Vamos a estar usando la versión 2.4.2 DRF para esta aplicación.

Este tutorial cubre los siguientes temas : Bonus

gratuito: Haga clic aquí para descargar una copia de los «Ejemplos» API REST Guía y obtener una introducción práctica a principios del API Python + REST con ejemplos de acciones concretas.

Si se ha perdido partes uno y dos de esta serie de tutoriales, asegúrese de comprobar a cabo. Necesitará el código? Puedes descargarlo desde el repositorio. Para ver un tutorial más en profundidad sobre Django marco Resto, echa un vistazo al tercer curso real del pitón. configuración

DRF

Instalar:

$ pip install djangorestframework
$ pip freeze > requirements.txt

actualización settings.py : Boom

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'talk',
'rest_framework'
)

! Estructura

REST

En una API REST, los puntos finales (URL) definen la estructura de la API y cómo acceder a los datos a los usuarios finales de nuestra aplicación utilizando los métodos HTTP: GET, POST, PUT, DELETE. Los puntos finales deben ser organizados lógicamente en torno colecciones y elementos , ambos de los cuales son los recursos. En nuestro caso, tenemos un único recurso, mensajes, por lo que vamos a utilizar las siguientes direcciones URL – / mensajes / y / mensajes / para las colecciones y elementos , respectivamente.

DRF inicio rápido

vamos a obtener nuestra nueva API en marcha y funcionando! Serializadores instancias de modelo convertido

Modelo Serializador

de DRF a dictionaires Python, que luego pueden ser prestados en varios formatos apropiados API – como JSON o XML. Al igual que en la clase de Django ModelForm, DRF viene con un formato conciso de sus Serializadores, la clase ModelSerializer. Es sencillo de usar: basta decir que los campos que desea utilizar en el modelo:

from rest_framework import serializers
from talk.models import Post

class PostSerializer(serializers.ModelSerializer):

class Meta:
model = Post
fields = ('id', 'author', 'text', 'created', 'updated')

Guardar esto como serializers.py dentro del directorio “hablar”.

Actualizar vistas

Tenemos que refactorizar nuestros puntos de vista actuales para adaptarse al paradigma de descanso. Comentar los puntos de vista actuales y añadir en:

from django.shortcuts import render
from django.http import HttpResponse
from rest_framework.decorators import api_view
from rest_framework.response import Response
from talk.models import Post
from talk.serializers import PostSerializer
from talk.forms import PostForm

def home(request):
tmpl_vars = {'form': PostForm()}
return render(request, 'talk/index.html', tmpl_vars)

@api_view(['GET'])
def post_collection(request):
if request.method == 'GET':
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)

@api_view(['GET'])
def post_element(request, pk):
try:
post = Post.objects.get(pk=pk)
except Post.DoesNotExist:
return HttpResponse(status=404)

if request.method == 'GET':
serializer = PostSerializer(post)
return Response(serializer.data)

lo que está pasando aquí :

Lea más sobre la @api_view de la documentación oficial. alambre de

actualización URL

Let algunas nuevas direcciones URL:

# Talk urls
from django.conf.urls import patterns, url

urlpatterns = patterns(
'talk.views',
url(r'^$', 'home'),

# api
url(r'^api/v1/posts/$', 'post_collection'),
url(r'^api/v1/posts/(?P[0-9]+)$', 'post_element')
)

prueba

Ahora estamos listos para nuestra primera prueba!

Ahora vamos a ver la API navegable. Vaya a http://127.0.0.1:8000/api/v1/posts/

Por lo tanto, sin trabajo extra en nuestro fin obtenemos automáticamente este agradable, salida legible por humanos de nuestra API. ¡Agradable! Esta es una gran ganar para DRF.

¿Qué hay de un elemento? Proveedores: http://127.0.0.1:8000/api/v1/posts/1

Antes de continuar se habrán dado cuenta de que el campo de autor es un identificador en lugar del nombre de usuario real. Trataremos esto en breve. Por ahora, alambre de amainó nuestra nueva API para que funcione con plantillas de nuestra aplicación actual.

Refactor REST

LLEGAR

En la carga de la página inicial, queremos mostrar todos los mensajes. Para ello, agregue la siguiente petición AJAX:

load_posts()

// Load all posts on page load
function load_posts() {
$.ajax({
url : "api/v1/posts/", // the endpoint
type : "GET", // http method
// handle a successful response
success : function(json) {
for (var i = 0; i < json.length; i++) { console.log(json[i]) $("#talk").prepend("

  • "+json[i].text+" - "+json[i].author+" - "+json[i].created+
    "
    - delete me
  • ");
    }
    },
    // handle a non-successful response
    error : function(xhr,errmsg,err) {
    $('#results').html("

    Oops! We have encountered an error: "+errmsg+
    " ×

    "); // add the error to the dom
    console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console
    }
    });
    };

    Usted ha visto todo esto antes. Observe cómo estamos manejando un éxito: Desde la API devuelve una serie de objetos, necesitamos iterar a través de ellos, añadiendo cada una de DOM. También hemos cambiado JSON [i] .postpk a JSON [i] .id ya que estamos serializar el ID del mensaje. Prueba

    esto. Encender el servidor, inicie sesión, a continuación, echa un vistazo a los mensajes.

    Además el autor se muestra como un id, tome nota del formato de fecha y hora. Esto no es lo que queremos, ¿verdad? Queremos un legible fecha y hora formato. La actualización de dejar que eso …

    de fecha y hora Formato

    Podemos utilizar una biblioteca impresionante JavaScript llamada MomentJS a formato fácilmente la fecha de todos modos queremos.

    En primer lugar, tenemos que importar la biblioteca en nuestro archivo index.html :




    a continuación, actualizar el bucle en main.js :

    for (var i = 0; i < json.length; i++) { dateString = convert_to_readable_date(json[i].created) $("#talk").prepend("

  • "+json[i].text+
    "
    - "+json[i].author+" - "+dateString+
    "
    - delete me
  • ");
    }

    Aquí se pasa la cadena de fecha a una nueva función llamada convert_to_readable_date ( ), lo que hay que añadir:

    // convert ugly date to human readable date
    function convert_to_readable_date(date_time_string) {
    var newDate = moment(date_time_string).format('MM/DD/YYYY, h:mm:ss a')
    return newDate
    }

    Eso es todo. Actualizar el navegador. El formato de fecha y hora debería ser ahora algo como esto – 08/22/2014, 06:48:29 pm. Asegúrese de revisar la documentación MomentJS para ver más información sobre el análisis y dar formato a una cadena de fecha y hora en JavaScript. solicitudes

    POSTAL

    POST se manejan de manera similar. Antes de jugar con el serializador, vamos a probarlo primero con sólo la actualización de las vistas. Tal vez tengamos suerte y que sólo vamos a trabajar.

    actualización de la función post_collection () en views.py :

    @api_view(['GET', 'POST'])
    def post_collection(request):
    if request.method == 'GET':
    posts = Post.objects.all()
    serializer = PostSerializer(posts, many=True)
    return Response(serializer.data)
    elif request.method == 'POST':
    data = {'text': request.DATA.get('the_post'), 'author': request.user.pk}
    serializer = PostSerializer(data=data)
    if serializer.is_valid():
    serializer.save()
    return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    añada también la siguiente importación:

    from rest_framework import status

    lo que está pasando aquí :

    actualización de la variable en la función create_post ()

    Desde:

    url : "create_post/", // the endpoint
    Para

    :

    url : "api/v1/posts/", // the endpoint

    probarlo en el navegador. Deberia de funcionar. No se olvide de actualizar el manejo de las fechas correctamente, así como el cambio de json.postpk a json.id: un momento de buena

    success : function(json) {
    $('#post-text').val(''); // remove the value from the input
    console.log(json); // log the returned json to the console
    dateString = convert_to_readable_date(json.created)
    $("#talk").prepend("

  • "+json.text+" - "+
    json.author+"
    - "+dateString+
    "
    - delete me
  • ");
    console.log("success"); // another sanity check
    },

    Autor Formato

    ahora para hacer una pausa y abordar la cuestión vs. nombre de usuario Identificación del autor. Tenemos un par de opciones: ir de

    Vamos con la segunda opción. Actualizar el serializador:

    from django.contrib.auth.models import User
    from rest_framework import serializers
    from talk.models import Post

    class PostSerializer(serializers.ModelSerializer):
    author = serializers.SlugRelatedField(
    queryset=User.objects.all(), slug_field='username'
    )

    class Meta:
    model = Post
    fields = ('id', 'author', 'text', 'created', 'updated')

    ¿Qué está pasando aquí?

    actualización de la variable de datos en las vistas, así:

    data = {'text': request.DATA.get('the_post'), 'author': request.user}
    prueba

    nuevo. Ahora debería ver el nombre de usuario del autor. Asegúrese de que tanto GET y POST peticiones están funcionando correctamente.

    Eliminar

    Antes de cambiar o añadir algo, probarlo. Probar el enlace borrar. ¿Lo que pasa? Usted debe obtener un error 404. ¿Alguna idea de por qué eso sería? O dónde ir para averiguar cuál es el problema? ¿Qué hay de la función delete_post en nuestro archivo JavaScript:

    url : "delete_post/", // the endpoint

    esa URL no existe. Antes lo actualizamos, hágase – “¿Hay que apuntar a la colección o un elemento individual?”. Si no está seguro, desplazarse hacia atrás y vistazo a la tabla Estructura REST. A menos que queramos eliminar todos los mensajes , entonces tenemos que golpear el elemento de punto final:

    url : "api/v1/posts/"+post_primary_key, // the endpoint
    prueba

    nuevo. Ahora lo que sucede? Debería ver el error 405 – 405: { «detalle»: «Método ‘Eliminar’ no está permitido.»} – desde el punto de vista no está configurado para manejar una solicitud DELETE.

    @api_view(['GET', 'DELETE'])
    def post_element(request, pk):
    try:
    post = Post.objects.get(pk=pk)
    except Post.DoesNotExist:
    return HttpResponse(status=404)

    if request.method == 'GET':
    serializer = PostSerializer(post)
    return Response(serializer.data)

    elif request.method == 'DELETE':
    post.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

    Con el HTTP DELETE añadió verbo, podemos manejar la petición quitando el puesto con el método delete () y devolver una respuesta 204. ¿Funciona? Sólo hay una forma de averiguarlo. Esta vez cuando se prueba asegurarse de que (a) el mensaje es en realidad elimina y se retira del DOM y (b) que se devuelve un código 204 de estado (se puede confirmar esto en la pestaña Red dentro Chrome Developer Tools ) .

    Conclusión y Bonus Próxima Pasos

    gratuito: Haga clic aquí para descargar una copia de los «Ejemplos» API REST Guía y obtener una introducción práctica a principios del API Python + REST con ejemplos de acciones concretas.

    Esto es todo por ahora. Necesitará un desafío extra? Añadir la capacidad de actualizar los mensajes con la solicitud PUT.

    Es la parte real resto es simple: Sólo tiene que actualizar la función post_element () para peticiones PUT mango.

    El lado del cliente es un poco más difícil, ya que es necesario actualizar el código HTML actual para mostrar un cuadro de entrada para que el usuario introduzca el nuevo valor en el que tendrá que agarrar en el archivo JavaScript para que pueda enviarlo con la solicitud PUT.

    ¿Vas a permitir que cualquier usuario actualizar cualquier puesto, independientemente de que s / él Iniciado ella?

    Si es así, ¿vas a actualizar el nombre del autor? Tal vez añadir un campo edited_by a la base de datos? A continuación, mostrar una editado por nota en el DOM también. Si los usuarios sólo pueden actualizar sus propios mensajes, es necesario asegurarse de que está manejando esto correctamente en las vistas y luego mostrar un mensaje de error si el usuario está tratando de editar un post que s / él no le envió originalmente.

    O tal vez lo que podría eliminar el enlace de edición (y tal vez el enlace borrar también) para los puestos que un determinado usuario no pueden editar. Se podría convertirlo en un problema de permisos y sólo deja que ciertos usuarios, como moderadores o administrador, editar todos los mensajes, mientras que el resto de usuarios sólo pueden actualizar sus propios mensajes.

    tantas preguntas.

    Si decide probar esto, ir con el colgante más bajo de frutas simplemente permitir que cualquier usuario pueda actualizar cualquier puesto y sólo actualizar el texto en la base de datos. Entonces prueba. A continuación, añadir otra iteración. A continuación, prueba, etc. Tome notas y un correo electrónico a info@realpython.com para que podamos añadir un blog complementario!

    De todos modos, la próxima vez que usted llega a ver nos separará el código actual de JavaScript a medida que añadimos en angular ! Hasta entonces.

    Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *