وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

برنامه های تک صفحه ای با Vue.js و Flask: RESTful API with Flask

0 4
زمان لازم برای مطالعه: 11 دقیقه


RESTful API با Flask

به پست چهارم خوش آمدید روی استفاده از Vue.js و Flask برای توسعه وب تمام پشته. تمرکز این پست خواهد بود روی ساخت یک Backend REST API با استفاده از چارچوب وب Flask مبتنی بر پایتون.

کد این پست در یک مخزن است روی حساب GitHub من زیر شاخه پست چهارم.

محتوای سری

  1. راه اندازی و آشنایی با VueJS
  2. مسیریاب Vue
  3. مدیریت دولتی با Vuex
  4. RESTful API با Flask (تو اینجایی)
  5. ادغام AJAX با REST API
  6. احراز هویت JWT
  7. استقرار در یک سرور خصوصی مجازی

توضیح مختصر فلاسک

Flask یک میکرو فریمورک مبتنی بر پایتون برای نمونه سازی سریع و توسعه برنامه های کاربردی وب با اندازه کوچک تا متوسط ​​است. فلاسک قبلاً در چند پست قبلی اینجا و اینجا پوشش داده شده است روی rasanegar بنابراین، من به جزئیات زیاد مربوط به بخش های اصلی یا رایج Flask نمی پردازم. در عوض، من رویکرد عملگرایانه تری را با تمرکز بیشتر در پیش خواهم گرفت روی ساختن یک API RESTful برای تامین داده‌های پیشانی، که در مقالات منتهی به این مقاله به آن پرداختم.

داربست کردن فایل های پروژه Backend

من در پوشه /backend با ایجاد یک محیط مجازی Python3 و نصب Flask و چند کتابخانه ضروری دیگر شروع می کنم.

$ python -m venv venv
$ source venv/bin/activate
(venv) $ pip install Flask Flask-SQLAlchemy Flask-Migrate Flask-Script requests

یکی از چیزهایی که Flask (و تا حد زیادی کل اکوسیستم پایتون) را بسیار عالی می کند، تعداد زیادی بسته های خوب طراحی شده در دسترس است. روی PyPI. در زیر توضیح مختصری در مورد کتابخانه هایی که من نصب کرده ام و کاربرد مورد نظر آنها آورده شده است.

  • Flask: Web micro frame
  • Flask-SQLAlchemy: ORM مبتنی بر SQLAlchemy با مقداری سس عالی مخصوص فلاسک بسته بندی شده با آن
  • Flask-Migrate: کتابخانه مهاجرت پایگاه داده
  • Flask-Script: بسته بسیار مفید برای تعامل با یک برنامه Flask از خط فرمان
  • درخواست ها: بسته ای مفید برای ایجاد درخواست های شبکه که من از آن برای آزمایش REST API استفاده خواهم کرد

در پوشه /backend چند فایل جدید به نام می سازم manage.py و appserver.py. همچنین، من یک دایرکتوری جدید در داخل /backend ایجاد خواهم کرد که به من تبدیل می شود surveyapi کاربرد فلاسک. در داخل surveyapi دایرکتوری، من فایل ها را می سازم \_\_init\_\_.py، models.py، application.py، و api.py. این منجر به ایجاد یک ساختار دایرکتوری می شود که با /backend شروع می شود (با حذف نشان venv فهرست راهنما).

├── manage.py
├── appserver.py
└── surveyapi
    ├── __init__.py
    ├── api.py
    ├── application.py
    ├── config.py
    └── models.py

در زیر توضیح مختصری از آنچه قرار است از هر فایل استفاده شود آورده شده است:

  • manage.py: دسترسی به نمونه برنامه Flask برای دستورات مختلف Flask-Script
  • appserver.py: اسکریپت راه اندازی برای اجرای surveyapi کاربرد
  • surveyapi/: برنامه Backend Flask
  • \_\_init\_\_.py: می چرخد surveyapi دایرکتوری به یک بسته پایتون معتبر
  • api.py: برای تعریف نقاط پایانی مسیر REST API که قادر به مصرف و تولید درخواست و پاسخ های JSON هستند.
  • application.py: برای ایجاد یک نمونه از برنامه Flask
  • config.py: شامل تنظیمات پیکربندی برای برنامه Flask است
  • models.py: برای تعریف کلاس هایی که به عنوان اشیاء داده برای برنامه نظرسنجی مانند Survey، Question و Choice عمل می کنند.

ایجاد یک Application Factory

من شروع به کدنویسی می کنم surveyapi برنامه با تعریف برخی تنظیمات در داخل config.py مانند:

"""
config.py
- settings for the flask application object
"""

class BaseConfig(object):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///survey.db'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    
    SECRET_KEY = 'mysecretkey'

این کلاس پیکربندی a را تعریف می کند SQLALCHEMY_DATABASE_URI برنامه اتصال پایگاه داده URI به یک فایل واحد پایگاه داده SQLite به نام survey.db. همچنین فراهم می کند SECRET_KEY گزینه config که برای رمزگذاری استفاده می شود.

درون application.py، من چیزی را ایجاد خواهم کرد که به عنوان یک تابع کارخانه برنامه شناخته می شود، که دقیقاً همان کاری را انجام می دهد که به نظر می رسد، یک نمونه برنامه Flask ایجاد می کند. علاوه بر نمونه سازی یک نمونه از Flask، آن را نیز منبع می کند BaseConfig شیء می کند و نقشه مسیرهای API را که در مرحله بعد خواهم ساخت، ثبت می کند.

"""
application.py
- creates a Flask app instance and registers the database object
"""

from flask import Flask

def create_app(app_name='SURVEY_API'):
    app = Flask(app_name)
    app.config.from_object('surveyapi.config.BaseConfig')
    from surveyapi.api import api
    app.register_blueprint(api, url_prefix="/api")
    return app

Blueprint API

بعد من به سمت api.py ماژول که در آن من می توانم تعریف کنم Blueprint شی نامیده می شود api حاوی مسیرهای RESTful. برای ساده نگه داشتن همه چیز، من فقط با تعریف یک تابع view ساده به نام شروع می کنم say_hello() مرتبط با نقطه پایانی /api/hello/<string:name>/. این <string:name> بخشی از URL یک متغیر رشته پویا است که به تابع view ارسال می شود say_hello(name) به عنوان یک پارامتر تابع که من در پیام پاسخ JSON که برگردانده می شود استفاده می کنم.

"""
api.py
- provides the API endpoints for consuming and producing
  REST requests and responses
"""

from flask import Blueprint, jsonify, request

api = Blueprint('api', __name__)

@api.route('/hello/<string:name>/')
def say_hello(name):
    response = { 'msg': "Hello {}".format(name) }
    return jsonify(response)

نقطه ورود به سرور توسعه دهنده و اعتبار سنجی تنظیمات

برای آزمایش این باید چند خط کد اضافه کنم appserver.py برای ایجاد یک نمونه از برنامه این به من امکان می دهد با فراخوانی سرور برنامه نویس Flask را روشن کنم run() روش روی را app نمونه، مثال.

"""
appserver.py
- creates an application instance and runs the dev server
"""

if __name__ == '__main__':
    from surveyapi.application import create_app
    app = create_app()
    app.run()

برای اجرای سرور توسعه دهنده Flask تنها کاری که باید انجام دهم این است که مفسر پایتون را راه اندازی کرده و به آن تغذیه کنید appserver.py اسکریپت مطابق شکل زیر

(venv) $ python appserver.py
 * Running روی http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 676-284-544

اکنون برای آزمایش نقطه پایانی جدید، در یک جدید terminal با فعال شدن محیط مجازی، یک مفسر پایتون را راه‌اندازی می‌کنم و یک درخواست GET می‌کنم http://localhost:5000/api/hello/adam/ با استفاده از requests بسته بندی

(venv) $ python
>>> import requests
>>> response = requests.get('http://localhost:5000/api/hello/adam/')
>>> print(response.json())
{'msg': 'Hello adam'}

تعریف لایه داده

اکنون که تأیید کرده‌ام که یک برنامه کاربردی Flask در داربست دارم، می‌توانم تمرکز کنم روی ساخت لایه داده با کمک ORM Flask-SQLAlchemy. پیاده سازی یک لایه داده مستلزم نوشتن چند کلاس داده در داخل است models.py مانند:

  • نظرسنجی: این شی سطح بالایی است که شامل یک یا چند سوال همراه با انتخاب های آنها خواهد بود
  • سوال: اشیایی که به یک شی نظرسنجی تعلق دارند و دارای انتخاب هستند
  • انتخاب: اشیایی که به یک سوال تعلق دارند و گزینه هایی را برای سوال نظرسنجی نشان می دهند

این کلاس‌های داده، فیلدهایی را ایجاد می‌کنند که تا حد زیادی از مواردی که قبلاً در مقالات توضیح داده شد، تقلید می‌کنند روی ساختن برنامه Vue.js frontend، اما اینها به جداول پایگاه داده که در آن داده‌هایشان باقی می‌ماند، نگاشت می‌شوند.

"""
models.py
- Data classes for the surveyapi application
"""

from datetime import datetime
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Survey(db.Model):
    __tablename__ = 'surveys'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    questions = db.relationship('Question', backref="survey", lazy=False)

    def to_dict(self):
        return dict(id=self.id,
                    name=self.name,
                    created_at=self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
                    questions=(question.to_dict() for question in self.questions))

class Question(db.Model):
    __tablename__ = 'questions'

    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.String(500), nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    survey_id = db.Column(db.Integer, db.ForeignKey('surveys.id'))
    choices = db.relationship('Choice', backref='question', lazy=False)

    def to_dict(self):
        return dict(id=self.id,
                    text=self.text,
                    created_at=self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
                    survey_id=self.survey_id,
                    choices=(choice.to_dict() for choice in self.choices))

class Choice(db.Model):
    __tablename__ = 'choices'

    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.String(100), nullable=False)
    selected = db.Column(db.Integer, default=0)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    question_id = db.Column(db.Integer, db.ForeignKey('questions.id'))

    def to_dict(self):
        return dict(id=self.id,
                    text=self.text,
                    created_at=self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
                    question_id=self.question_id)

همانطور که قبلا ذکر شد، من از پسوند Flask-specific SQLAlchemy به نام استفاده می کنم Flask-SQLAlchemy برای تغذیه ORM برای این برنامه. من Flask-SQLAlchemy را دوست دارم زیرا یک API نسبتا پایتونیک دارد و پیش‌فرض‌های معقولی را برای تعریف و کار با کلاس‌های داده ارائه می‌کند.

هر کلاس از SQLAlchemy’s ارث می برد Model کلاس پایه که روش های کاربردی بصری و قابل خواندن را برای تعامل با داده های ذخیره شده در پایگاه داده ارائه می دهد. علاوه بر این، هر کلاس از یک سری فیلدهای کلاس تشکیل شده است که همانطور که توسط SQLAlchemy مشخص شده است به فیلدهای جدول پایگاه داده ترجمه می شوند. Column کلاس و نوع مرتبط (یعنی Integer، String، DateTime، Text، …).

همچنین متوجه خواهید شد که هر کلاس دارای یک ویژگی مشترک است to_dict() روش. این روش برای سریال‌سازی داده‌های مدل‌ها در JSON هنگام ارسال آن‌ها از طریق سیم به مشتری frontend مفید خواهد بود.

بعدی روی لیستی که باید انجام دهید ثبت شی SQLAlchemy است، db، با شی برنامه کاربردی Flask در application.py.

"""
application.py
- creates a Flask app instance and registers the database object
"""

from flask import Flask

def create_app(app_name='SURVEY_API'):
    app = Flask(app_name)
    app.config.from_object('surveyapi.config.BaseConfig')

    from surveyapi.api import api
    app.register_blueprint(api, url_prefix="/api")

    from surveyapi.models import db
    db.init_app(app)

    return app

آخرین کاری که من می خواهم انجام دهم این است که آنها را گرد هم بیاورم فلاسک-اسکریپت و فلاسک – مهاجرت بسته های الحاقی در داخل manage.py ماژول برای فعال کردن مهاجرت. این ماژول مفید، manage.py، کلاس های داده ای را که اخیراً تعریف کردم جمع آوری می کند و آنها را به زمینه برنامه همراه با ماشین آلات Flask-Migrate و Flask-Script مرتبط می کند.

"""
manage.py
- provides a command line utility for interacting with the
  application to perform interactive debugging and setup
"""

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

from surveyapi.application import create_app
from surveyapi.models import db, Survey, Question, Choice

app = create_app()

migrate = Migrate(app, db)
manager = Manager(app)


manager.add_command('db', MigrateCommand)


@manager.shell
def shell_ctx():
    return dict(app=app,
                db=db,
                Survey=Survey,
                Question=Question,
                Choice=Choice)

if __name__ == '__main__':
    manager.run()

من دو چیز را در این بیت کد بالا انجام می دهم. ابتدا، من یک نمونه از شی برنامه کاربردی Flask ایجاد می کنم تا زمینه را برای آن فراهم کند Migrate(app, db) و Manage(app) نمونه ها سپس یک دستور را به آن اضافه می کنم manager شی ای که به من امکان می دهد مهاجرت ها را از خط فرمان ایجاد و اجرا کنم مانند:

(venv) $ python manage.py db init
  • دایرکتوری migrations در کنار surveyapi فایل برنامه و پایگاه داده survey.db
(venv) $ python manage.py db migrate
  • یک فایل مهاجرت اولیه برای ترجمه کلاس ها ایجاد کنید models.py به SQL که جداول مربوطه را تولید می کند
(venv) $ python manage.py db upgrade
  • مهاجرت را اجرا کنید تا پایگاه داده را با جداول توضیح داده شده در مرحله قبل ارتقا دهید

آخرین کاری که در آن انجام می دهم manage.py ماژول در حال ایجاد یک دستور سفارشی دیگر با استفاده از @manager.shell برای تزئین یک shell_ctx() تابعی که نگاشت دستوری کلمات کلیدی را به app و db اشیاء همراه با Survey، Question و Choice کلاس های داده

من اکنون از سودمندی این دستور کاربردی پوسته برای نشان دادن روش کار با Flask-SQLAlchemy ORM در python مترجمی که تولید می کند.

(venv) $ python manage.py shell
(venv) Adams-MacBook-Pro:backend adammcquistan$ python manage.py shell
>>> survey = Survey(name='Dogs')
>>> question = Question(text='What is your favorite dog?')
>>> question.choices = (Choice(text='Beagle'), Choice(text='Rottweiler'), Choice(text='Labrador'))
>>> question2 = Question(text='What is your second favorite dog?')
>>> question2.choices = (Choice(text='Beagle'), Choice(text='Rottweiler'), Choice(text='Labrador'))
>>> survey.questions = (question, question2)
>>> db.session.add(survey)
>>> db.session.commit()
>>> surveys = Survey.query.all()
>>> for s in surveys:
...     print('Survey(id={}, name={})'.format(s.id, s.name))
...     for q in s.questions:
...             print('  Question(id={}, text={})'.format(q.id, q.text))
...             for c in q.choices:
...                     print('    Choice(id={}, text={})'.format(c.id, c.text))
...
Survey(id=1, name=Dogs)
  Question(id=1, text=What is your favorite dog?)
    Choice(id=1, text=Beagle)
    Choice(id=3, text=Labrador)
    Choice(id=2, text=Rottweiler)
  Question(id=2, text=What is your second favorite dog?)
    Choice(id=4, text=Beagle)
    Choice(id=6, text=Labrador)
    Choice(id=5, text=Rottweiler)

خیلی نرم است، درست است؟

من فقط در مورد نحو زیبا و خوانا ORM صحبت نمی کنم، بلکه توانایی فوق العاده قدرتمند برای راه اندازی یک مفسر پایتون حاوی زمینه برنامه برای انجام آزمایش های کوچک سریع با مدل های برنامه شما نیست. من نمی توانم به شما بگویم که این افزایش بهره وری در هنگام ساخت برنامه های کاربردی باطن چقدر به من کمک کرده است، و به طور جدی به شما پیشنهاد می کنم هنگام انجام همین کار از آن استفاده کنید.

تکمیل API RESTful

اکنون که لایه دسترسی به داده ساخته شده است، می توانم توجه خود را متمرکز کنم روی تکمیل پیاده سازی لازم برای RESTful API. این به مصرف و بازگرداندن منابع برنامه مانند داده‌های Survey، Question و Choice می‌پردازد. موارد استفاده مورد نیاز از RESTful API شامل موارد زیر است:

  • همه نظرسنجی ها را به همراه سوالات و انتخاب های آنها واکشی کنید
  • یک نظرسنجی را همراه با سؤالات و گزینه های آن واکشی کنید
  • یک نظرسنجی جدید به همراه سوالات و انتخاب های مشخص شده آن ایجاد کنید
  • پس از انجام یک نظرسنجی، گزینه های پاسخ نظرسنجی را به روز کنید

برای شروع من ادامه خواهم داد و import تمام کلاس های داده به همراه SQLAlchemy db به عنوان مثال بنابراین من به آنها دسترسی دارم. در بالای api.py، واردات زیر را اضافه می کنم:

"""
api.py
- provides the API endpoints for consuming and producing
  REST requests and responses
"""

from flask import Blueprint, jsonify, request
from .models import db, Survey, Question, Choice

در مورد نقاط پایانی منابع واقعی، من با کدگذاری توانایی واکشی همه منابع نظرسنجی شروع خواهم کرد. داخل api.py، باید تعویض کنم /hello/<string:name>/ نقطه پایانی با مسیر /surveys/ نقطه پایانی و surveys() عملکرد مشاهده

@api.route('/surveys/')
def surveys():
    surveys = Survey.query.all()
    return jsonify({ 'surveys': (s.to_dict() for s in surveys) })

اگر سرور توسعه دهنده هنوز در حال اجرا است، پس از ذخیره فایل های پروژه، سرور باید به طور خودکار بارگیری مجدد شود و همه تغییرات را به روز کند. اگر نه، پس اجرا کنید (venv) $ python appserver.py سرور را راه اندازی خواهد کرد. حالا در دیگری terminal با فعال شدن محیط مجازی می توانم از آن استفاده کنم requests بسته برای آزمایش این نقطه پایانی جدید. با این حال، من می خواهم یک نکته حرفه ای را به اشتراک بگذارم روی نمایش پاسخ های JSON به روشی خواناتر با استفاده از یک بسته عالی پایتون به نام pprint.

(venv) $ pip install pprint
(venv) $ python
>>> import pprint, requests
>>> pp == pprint.PrettyPrinter()
>>> resp = requests.get('http://localhost:5000/api/surveys/')
>>> pp.pprint(resp.json())
{'surveys': ({
     'created_at': '2018-03-06 03:52:44',
     'id': 1,
     'name': 'Dogs',
     'questions': ({
          'choices': ({
               'created_at': '2018-03-06 03:52:44',
               'id': 1,
               'question_id': 1,
               'text': 'Beagle'
              },{
               'created_at': '2018-03-06 03:52:44',
               'id': 3,
               'question_id': 1,
               'text': 'Labrador'
              },{
               'created_at': '2018-03-06 03:52:44',
               'id': 2,
               'question_id': 1,
               'text': 'Rottweiler'}),
            'created_at': '2018-03-06 03:52:44',
            'id': 1,
            'survey_id': 1,
            'text': 'What is your favorite dog?'
         },{
          'choices': ({
              'created_at': '2018-03-06 03:52:44',
              'id': 4,
              'question_id': 2,
              'text': 'Beagle'
             },{
              'created_at': '2018-03-06 03:52:44',
              'id': 6,
              'question_id': 2,
              'text': 'Labrador'
             },{
              'created_at': '2018-03-06 03:52:44',
              'id': 5,
              'question_id': 2,
              'text': 'Rottweiler'}),
          'created_at': '2018-03-06 03:52:44',
          'id': 2,
          'survey_id': 1,
          'text': 'What is your second favorite dog?'})}
    )}

در مرحله بعد، من عملکردی را برای واکشی یک نظرسنجی توسط آن پیاده‌سازی می‌کنم id با نقطه پایانی URL /surveys/id/ و عملکرد را مشاهده کنید survey(id). بلافاصله به دنبال surveys() تابع نمایش API کد زیر را قرار می دهم:

@api.route('/surveys/<int:id>/')
def survey(id):
    survey = Survey.query.get(id)
    return jsonify({ 'survey': survey.to_dict() })

دوباره، فایل‌ها را ذخیره می‌کنم و نقطه پایانی API جدید را آزمایش می‌کنم تا مطمئن شوم که پاسخ معتبری ارائه می‌دهد.

>>> resp = requests.get('http://localhost:5000/api/surveys/1/')
>>> pp.pprint(resp.json())
{'survey': {
     'created_at': '2018-03-06 03:52:44',
     'id': 1,
     'name': 'Dogs',
     'questions': ({
          'choices': ({
               'created_at': '2018-03-06 03:52:44',
               'id': 1,
               'question_id': 1,
               'text': 'Beagle'
              },{
               'created_at': '2018-03-06 03:52:44',
               'id': 3,
               'question_id': 1,
               'text': 'Labrador'
              },{
               'created_at': '2018-03-06 03:52:44',
               'id': 2,
               'question_id': 1,
               'text': 'Rottweiler'}),
            'created_at': '2018-03-06 03:52:44',
            'id': 1,
            'survey_id': 1,
            'text': 'What is your favorite dog?'
         },{
          'choices': ({
              'created_at': '2018-03-06 03:52:44',
              'id': 4,
              'question_id': 2,
              'text': 'Beagle'
             },{
              'created_at': '2018-03-06 03:52:44',
              'id': 6,
              'question_id': 2,
              'text': 'Labrador'
             },{
              'created_at': '2018-03-06 03:52:44',
              'id': 5,
              'question_id': 2,
              'text': 'Rottweiler'}),
          'created_at': '2018-03-06 03:52:44',
          'id': 2,
          'survey_id': 1,
          'text': 'What is your second favorite dog?'})}
    }

تاکنون فقط از روش پیش‌فرض HTTP GET مناسب برای واکشی داده‌ها از APIهای RESTful استفاده کرده‌ام. با این حال، برای دو بخش آخر عملکرد، من باید از روش‌های HTTP POST و PUT برای نقاط پایانی استفاده کنم. /api/surveys/ و /api/surveys/id/، به ترتیب. من از روش HTTP POST برای ایجاد نظرسنجی های جدید و روش HTTP PUT برای به روز رسانی یک نظرسنجی موجود با مجموعه جدیدی از گزینه های پاسخ منتخب استفاده خواهم کرد.

برای /api/surveys/ route I باید یک پارامتر متد به اعلان مسیر اضافه کنم تا مشخص شود که هر دو متد GET و POST را می پذیرد. methods=('GET','POST'). علاوه بر این من بدنه را تغییر خواهم داد surveys() مشاهده تابع برای متمایز کردن نوع روش و افزودن قابلیت ذخیره یک نظرسنجی جدید به پایگاه داده.

@api.route('/surveys/', methods=('GET', 'POST'))
def fetch_surveys():
    if request.method == 'GET':
        surveys = Survey.query.all()
        return jsonify({ 'surveys': (s.to_dict() for s in surveys) })
    elif request.method == 'POST':
        data = request.get_json()
        survey = Survey(name=data('name'))
        questions = ()
        for q in data('questions'):
            question = Question(text=q('text'))
            question.choices = (Choice(text=c('text'))
                                for c in q('choices'))
            questions.append(question)
        survey.questions = questions
        db.session.add(survey)
        db.session.commit()
        return jsonify(survey.to_dict()), 201

دوباره، من می خواهم پروژه را ذخیره کنم و آن را آزمایش کنم تا مطمئن شوم که یک منبع ذخیره نظرسنجی کاملاً کاربردی دارم.

>>> import json
>>> survey = {
...   'name': 'Cars',
...   'questions': ({
...     'text': 'What is your favorite car?',
...     'choices': (
...       { 'text': 'Corvette' },
...       { 'text': 'Mustang' },
...       { 'text': 'Camaro' })
...   }, {
...     'text': 'What is your second favorite car?',
...     'choices': (
...       { 'text': 'Corvette' },
...       { 'text': 'Mustang' },
...       { 'text': 'Camaro' })
...   })
... }
>>> headers = {'Content-type': 'application/json'}
>>> resp = requests.post('http://localhost:5000/api/surveys/', headers=headers, data=json.dumps(survey))
>>> resp.status_code
201

آخرین قطعه برای پیاده سازی، توانایی به روز رسانی یک نظرسنجی موجود با انتخاب پاسخ های جدید نظرسنجی است. مجدداً باید متدهای GET و PUT را به آن اضافه کنم /api/surveys/id/ تعریف مسیر، methods=('GET', 'PUT'). سپس من به روز رسانی survey(id) عملکرد مشاهده برای به‌روزرسانی گزینه‌های سؤال نظرسنجی مرتبط که در بدنه JSON درخواست PUT انتخاب شده‌اند.

@api.route('/surveys/<int:id>/', methods=('GET', 'PUT'))
def survey(id):
    if request.method == 'GET':
        survey = Survey.query.get(id)
        return jsonify({ 'survey': survey.to_dict() })
    elif request.method == 'PUT':
        data = request.get_json()
        for q in data('questions'):
            choice = Choice.query.get(q('choice'))
            choice.selected = choice.selected + 1
        db.session.commit()
        survey = Survey.query.get(data('id'))
        return jsonify(survey.to_dict()), 201

در نهایت، من باید تمام فایل های خود را ذخیره کنم و یک آزمایش نهایی مانند این را انجام دهم:

>>> survey_choices = {
...   'id': 1,
...   'name': 'Dogs',
...   'questions': (
...     { 'id': 1, 'choice': 1 },
...     { 'id': 2, 'choice': 5 })
... }
>>> headers = {'Content-type': 'application/json'}
>>> resp = requests.put('http://localhost:5000/api/surveys/1/', data=json.dumps(survey_choices), headers=headers)
>>> resp.status_code()
201

منابع

آیا می خواهید در مورد پایتون و ساختن API های بک اند بیشتر بدانید؟ سعی کنید دوره ای مانند را بررسی کنید REST APIها با Flask و Python برای غواصی عمیق تر در زمینه توسعه وب با پایتون.

نتیجه

در این مقاله روش پیاده‌سازی یک API ساده، نسبتاً خالی، RESTful را با استفاده از Flask طبق جدول زیر توضیح داده‌ام:

مسیر روش قابلیت کارکرد
/api/surveys/ گرفتن بازیابی همه نظرسنجی ها
/api/surveys/ پست یک نظرسنجی جدید ایجاد کنید
/api/surveys/id/ گرفتن بازیابی نظرسنجی توسط ID
/api/surveys/id/ قرار دادن انتخاب های یک نظرسنجی را به روز کنید

در مقاله بعدی روش ادغام برنامه frontend Vue.js را نشان خواهم داد تا بتواند به‌روزرسانی‌های داده را به باطن Flask مصرف کرده و فشار دهد.

مثل همیشه، ممنون که خواندید و از نظر دادن یا انتقاد در زیر خجالت نکشید.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-28 05:29:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید