เชเซ เชคเชฎเซ เช เชฒเซเช เชตเชพเชเชเซ เชฐเชนเซเชฏเชพ เชเซ, เชคเซ เชคเชฎเซ เชเชฆเชพเช เชชเชนเซเชฒเชพเชฅเซ เช เชเชตเซ เชถเชเซเชฏเชคเชพเชเชฅเซ เชชเชฐเชฟเชเชฟเชค เชเซ เชเซ API (เชเชชเซเชฒเชฟเชเซเชถเชจ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเช เชเชจเซเชเชฐเชซเซเชธ) เชจเซ เชเชชเชฏเซเช เชเชฐเชคเซ เชตเชเชคเซ เชเซเชฒเซ เชเซ.
เชคเชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชฎเชพเช เชเชฃเชพ เชฌเชงเชพ เชธเชพเชฐเซเชตเชเชจเชฟเช APIเชฎเชพเชเชฅเซ เชเช เชเชฎเซเชฐเซเชจเซ, เชคเชฎเซ เช เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพเชจเซ เชตเชฟเชธเซเชคเซเชค เชเชฐเซ เชถเชเซ เชเซ เช
เชฅเชตเชพ เชคเซเชจเซ เชเชฐเซเชฐเซ เชกเซเชเชพ เชธเชพเชฅเซ เชชเซเชฐเช เชฌเชจเชพเชตเซ เชถเชเซ เชเซ. เชชเชฐเชเชคเซ เชเซ เชคเชฎเซ เชเช เชตเชฟเชถเชฟเชทเซเช เชธเซเชตเชฟเชงเชพ เชตเชฟเชเชธเชพเชตเซ เชนเซเชฏ เชเซ เชคเชฎเซ เชธเชฎเซเชฆเชพเชฏ เชธเชพเชฅเซ เชถเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเชเซ เชเซ เชคเซ เชถเซเช?
เชเชตเชพเชฌ เชธเชฐเชณ เชเซ: เชคเชฎเชพเชฐเซ เชเชฐเซเชฐ เชเซ
เชเซเชฏเชพเชฐเซ เช เชถเชฐเซเชเชคเชฎเชพเช เชฎเซเชถเซเชเซเชฒ เชเชพเชฐเซเชฏ เชเซเชตเซเช เชฒเชพเชเซ เชเซ, เชคเซ เชตเชพเชธเซเชคเชตเชฎเชพเช เชเชเชฆเชฎ เชธเชฐเชณ เชเซ. เช เชฎเซ เชคเชฎเชจเซ เชฌเชคเชพเชตเซเชถเซเช เชเซ เชชเชพเชฏเชฅเซเชจ เชธเชพเชฅเซ เช เชเซเชตเซ เชฐเซเชคเซ เชเชฐเชตเซเช.
เชคเชฎเชพเชฐเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพ เชฎเชพเชเซ เชถเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ
API เชตเชฟเชเชพเชธ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชเซ:
- เชชเชพเชฏเชฅเซเชจ 3;
เชฌเชพเชเชฒเซ โ เชตเซเชฌ เชเชชเซเชฒเชฟเชเซเชถเชจ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชธเชฐเชณ เช เชจเซ เชเชชเชฏเซเชเชฎเชพเช เชธเชฐเชณ เชฎเชพเชณเชเซเช;เชซเซเชฒเชพเชธเซเช-เชฐเซเชธเซเชเชซเซเชฒ เชซเซเชฒเชพเชธเซเช เชฎเชพเชเซ เชเช เชเชเซเชธเซเชเซเชเชถเชจ เชเซ เชเซ เชคเชฎเชจเซ เชเชกเชชเชฅเซ เช เชจเซ เชจเซเชฏเซเชจเชคเชฎ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชธเชพเชฅเซ REST API เชตเชฟเชเชธเชพเชตเชตเชพ เชฎเชพเชเซ เชชเชฐเชตเชพเชจเชเซ เชเชชเซ เชเซ.
เชเชจเซเชธเซเชเซเชฒเซเชถเชจ เชเชฆเซเชถ เชฆเซเชตเชพเชฐเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
pip install flask-restful
เช เชฎเซ เชจเชตเชพ เชจเชฟเชถเชพเชณเซเชฏเชพ เชฎเชพเชเซ เชฎเชซเชค เชธเชเชจ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเชเชจเซ เชญเชฒเชพเชฎเชฃ เชเชฐเซเช เชเซเช:
C# เชฎเชพเช เชเซเชฒเชฟเชเซเชฐเชพเชฎ เชฌเซเช เชตเชฟเชเชพเชธ - เชเชเชธเซเช 26-28. เชเช เชฎเชซเชค เชธเชเชจ เชเซ เชคเชฎเชจเซ เชธเชนเชพเชฏเช เชฌเซเชเซเชธ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ เชคเซ เชธเชฎเชเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ, เชเซเชฒเชฟเชเซเชฐเชพเชฎ API เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพเชจเซ เชธเซเชตเชฟเชงเชพเช เช เชจเซ เช เชจเซเชฏ เชเซเชเชเชพเช. เชเซเชเชจเชพ เชคเซเชฐเชฃ เชธเชนเชญเชพเชเซเชเชจเซ เชธเซเชเชฟเชฒเชฌเซเชเซเชธ เชคเชฐเชซเชฅเซ 30 เชฐเซเชฌเซเชฒเซเชธ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ.
เชคเชฎเซ เชถเชฐเซ เชเชฐเซ เชคเซ เชชเชนเซเชฒเชพเช
เช
เชฎเซ เชฎเซเชณเชญเซเชค เชธเชพเชฅเซ RESTful API เชตเชฟเชเชธเชพเชตเชตเชพ เชเช เชฐเชนเซเชฏเชพ เชเซเช
เชเชพเชฐเซเชฏเชจเซ เชธเชเชชเซเชฐเซเชฃ เชฐเซเชคเซ เชธเชฎเชเชตเชพ เชฎเชพเชเซ, เชเชพเชฒเซ เชเชชเชฐ เชเชฃเชพเชตเซเชฒ เชฌเซ เชถเชฌเซเชฆเซเชจเซ เชธเชฎเชเซเช.
REST เชถเซเช เชเซ?
REST API (เชฐเชฟเชชเซเชฐเซเชเซเชจเซเชเซเชถเชจเชฒ เชธเซเชเซเช เชเซเชฐเชพเชจเซเชธเชซเชฐ) เช เชเช API เชเซ เชเซ เชกเซเชเชพเชจเซ เชเชชเชฒเซ เชเชฐเชตเชพ เชฎเชพเชเซ HTTP เชตเชฟเชจเชเชคเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ.
REST API เช เชเซเชเซเชเชธ เชฎเชพเชชเชฆเชเชกเซเชจเซ เชชเซเชฐเซเชฃ เชเชฐเชตเชพ เชเชตเชถเซเชฏเช เชเซ:
- เชเซเชฒเชพเชฏเชเช-เชธเชฐเซเชตเชฐ เชเชฐเซเชเชฟเชเซเชเซเชเชฐ: เชเซเชฒเชพเชฏเชเช เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเชจเซเชเชฐเชซเซเชธ เชธเชพเชฅเซ เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชเชฐเซ เชเซ, เช เชจเซ เชธเชฐเซเชตเชฐ เชฌเซเชเชเชจเซเชก เช เชจเซ เชกเซเชเชพ เชธเซเชเซเชฐ เชธเชพเชฅเซ เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชเชฐเซ เชเซ. เชเซเชฒเชพเชฏเชเช เช เชจเซ เชธเชฐเซเชตเชฐ เชธเซเชตเชคเชเชคเซเชฐ เชเซ, เชคเซเชฎเชพเชเชจเชพ เชเซเชเชชเชฃเชจเซ เชฌเซเชเชพเชฅเซ เช เชฒเชเชฅเซ เชฌเชฆเชฒเซ เชถเชเชพเชฏ เชเซ.
- เชธเซเชเซเชเชฒเซเชธ - เชธเชฐเซเชตเชฐ เชชเชฐ เชเซเช เชเซเชฒเชพเชฏเชจเซเช เชกเซเชเชพ เชธเชเชเซเชฐเชนเชฟเชค เชจเชฅเซ. เชธเชคเซเชฐ เชธเซเชฅเชฟเชคเชฟ เชเซเชฒเชพเชฏเชเช เชฌเชพเชเซ เชชเชฐ เชธเชเชเซเชฐเชนเชฟเชค เชเซ.
- เชเซเชถเซเชฌเชฟเชฒเชฟเชเซ - เชเซเชฒเชพเชเชจเซเช เชเชเชเชฆเชฐ เชชเซเชฐเชฆเชฐเซเชถเชจเชจเซ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชเซ เชธเชฐเซเชตเชฐ เชชเซเชฐเชคเชฟเชธเชพเชฆเซเชจเซ เชเซเชถ เชเชฐเซ เชถเชเซ เชเซ.
CRUD เชถเซเช เชเซ?
เชธเซเชเชฐเชฏเซเชกเซ เชเช เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเช เชเซเชฏเชพเชฒ เชเซ เชเซ เชเชพเชฐ เชฎเซเชณเชญเซเชค เชเซเชฐเชฟเชฏเชพเชเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ (เชฌเชจเชพเชตเซ, เชตเชพเชเชเซ, เช เชชเชกเซเช เชเชฐเซ เช เชจเซ เชเชพเชขเซ เชจเชพเชเซ).
REST API เชฎเชพเช, เชตเชฟเชจเชเชคเซเชจเชพ เชชเซเชฐเชเชพเชฐเซ เช เชจเซ เชตเชฟเชจเชเชคเซ เชชเชฆเซเชงเชคเชฟเช เชชเซเชธเซเช, เชเซเช, เชชเซเช, เชกเชฟเชฒเซเช เชเซเชตเซ เชเซเชฐเชฟเชฏเชพเช เชฎเชพเชเซ เชเชตเชพเชฌเชฆเชพเชฐ เชเซ.
เชนเชตเซ เช เชฎเซ เชฎเซเชณเชญเซเชค เชถเชฐเชคเซ เชธเชพเชฅเซ เชตเซเชฏเชตเชนเชพเชฐ เชเชฐเซเชฏเซ เชเซ, เช เชฎเซ API เชฌเชจเชพเชตเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซ เชถเชเซเช เชเซเช.
เชตเชฟเชเชพเชธ
เชเชพเชฒเซ เชเชฐเซเชเชฟเชซเชฟเชถเชฟเชฏเชฒ เชเชจเซเชเซเชฒเชฟเชเชจเซเชธ เชตเชฟเชถเซเชจเชพ เช เชตเชคเชฐเชฃเซเชจเซ เชญเชเชกเชพเชฐ เชฌเชจเชพเชตเซเช. AI เช เชเชเซ โโเชธเซเชฅเซ เชเชกเชชเชฅเซ เชตเชฟเชเชธเชคเซ เชคเชเชจเซเชเซเชฎเชพเชเชจเซ เชเช เชเซ, เช เชจเซ Python เช AI เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซเชจเซเช เชเช เชฒเซเชเชชเซเชฐเชฟเชฏ เชธเชพเชงเชจ เชเซ.
เช API เชธเชพเชฅเซ, เชชเชพเชฏเชฅเซเชจ เชกเซเชตเชฒเชชเชฐ เชเชกเชชเชฅเซ AI เชตเชฟเชถเซ เชเชพเชฃเซ เชถเชเซ เชเซ เช เชจเซ เชจเชตเซ เชธเชฟเชฆเซเชงเชฟเชเชฅเซ เชชเซเชฐเซเชฐเชฟเชค เชฅเช เชถเชเซ เชเซ. เชเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชชเชพเชธเซ เช เชตเชฟเชทเชฏ เชชเชฐ เชฎเซเชฒเซเชฏเชตเชพเชจ เชตเชฟเชเชพเชฐเซ เชนเซเชฏ, เชคเซ เชคเซ เชคเซเชฎเชจเซ เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช เชเชฎเซเชฐเซ เชถเชเชถเซ.
เชเชพเชฒเซ เชเชฐเซเชฐเซ เชฎเซเชกเซเชฏเซเชฒเซ เชเชฏเชพเชค เชเชฐเซเชจเซ เช เชจเซ เชซเซเชฒเชพเชธเซเช เชธเซเช เชเชฐเซเชจเซ เชถเชฐเซเชเชค เชเชฐเซเช:
from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)
เช เชธเซเชจเชฟเชชเซเชเชฎเชพเช, เชซเซเชฒเชพเชธเซเช, เชเชชเซเชเช เช เชจเซ เชฐเชฟเชธเซเชฐเซเชธ เช เชเชชเชฃเชจเซ เชเซเชเชคเชพ เชตเชฐเซเชเซ เชเซ.
Reqparse เช เชซเซเชฒเชพเชธเซเช-เชฐเซเชธเซเชเชซเซเชฒ เชฐเชฟเชเซเชตเซเชธเซเช เชชเชพเชฐเซเชธเชฟเชเช เชเชจเซเชเชฐเชซเซเชธ เชเซ... เชฐเซเชจเซเชกเชฎ เชเซเชตเซเช เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชคเชฎเชพเชฐเซ เชฐเซเชจเซเชกเชฎ เชฎเซเชกเซเชฏเซเชฒเชจเซ เชชเชฃ เชเชฐเซเชฐ เชชเชกเชถเซ.
เชนเชตเซ เชเชชเชฃเซ AI เชตเชฟเชถเซ เช เชตเชคเชฐเชฃเซเชจเซ เชญเชเชกเชพเชฐ เชฌเชจเชพเชตเซเชถเซเช.
เชฆเชฐเซเช เชฐเซเชชเซ เชเชจเซเชเซเชฐเซเชฎเชพเช เชถเชพเชฎเซเชฒ เชนเชถเซ:
- เชกเชฟเชเชฟเชเชฒ ID;
- เช เชตเชคเชฐเชฃเชจเชพ เชฒเซเชเชเชจเซเช เชจเชพเชฎ;
- เช เชตเชคเชฐเชฃ
เชเชพเชฐเชฃ เชเซ เช เชฎเชพเชคเซเชฐ เชเช เชถเซเชเชตเชพเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซ, เช เชฎเซ เชคเชฎเชพเชฎ เชเชจเซเชเซเชฐเซเชเชจเซ เชชเชพเชฏเชฅเซเชจ เชฏเชพเชฆเซเชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเซเชถเซเช. เชตเชพเชธเซเชคเชตเชฟเช เชเชชเซเชฒเชฟเชเซเชถเชจเชฎเชพเช, เช เชฎเซ เชคเซเชจเชพ เชฌเชฆเชฒเซ เชกเซเชเชพเชฌเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชถเซเช.
ai_quotes = [
{
"id": 0,
"author": "Kevin Kelly",
"quote": "The business plans of the next 10,000 startups are easy to forecast: " +
"Take X and add AI."
},
{
"id": 1,
"author": "Stephen Hawking",
"quote": "The development of full artificial intelligence could " +
"spell the end of the human raceโฆ " +
"It would take off on its own, and re-design " +
"itself at an ever increasing rate. " +
"Humans, who are limited by slow biological evolution, " +
"couldn't compete, and would be superseded."
},
{
"id": 2,
"author": "Claude Shannon",
"quote": "I visualize a time when we will be to robots what " +
"dogs are to humans, " +
"and Iโm rooting for the machines."
},
{
"id": 3,
"author": "Elon Musk",
"quote": "The pace of progress in artificial intelligence " +
"(Iโm not referring to narrow AI) " +
"is incredibly fast. Unless you have direct " +
"exposure to groups like Deepmind, " +
"you have no idea how fast โ it is growing " +
"at a pace close to exponential. " +
"The risk of something seriously dangerous " +
"happening is in the five-year timeframe." +
"10 years at most."
},
{
"id": 4,
"author": "Geoffrey Hinton",
"quote": "I have always been convinced that the only way " +
"to get artificial intelligence to work " +
"is to do the computation in a way similar to the human brain. " +
"That is the goal I have been pursuing. We are making progress, " +
"though we still have lots to learn about " +
"how the brain actually works."
},
{
"id": 5,
"author": "Pedro Domingos",
"quote": "People worry that computers will " +
"get too smart and take over the world, " +
"but the real problem is that they're too stupid " +
"and they've already taken over the world."
},
{
"id": 6,
"author": "Alan Turing",
"quote": "It seems probable that once the machine thinking " +
"method had started, it would not take long " +
"to outstrip our feeble powersโฆ " +
"They would be able to converse " +
"with each other to sharpen their wits. " +
"At some stage therefore, we should " +
"have to expect the machines to take control."
},
{
"id": 7,
"author": "Ray Kurzweil",
"quote": "Artificial intelligence will reach " +
"human levels by around 2029. " +
"Follow that out further to, say, 2045, " +
"we will have multiplied the intelligence, " +
"the human biological machine intelligence " +
"of our civilization a billion-fold."
},
{
"id": 8,
"author": "Sebastian Thrun",
"quote": "Nobody phrases it this way, but I think " +
"that artificial intelligence " +
"is almost a humanities discipline. It's really an attempt " +
"to understand human intelligence and human cognition."
},
{
"id": 9,
"author": "Andrew Ng",
"quote": "We're making this analogy that AI is the new electricity." +
"Electricity transformed industries: agriculture, " +
"transportation, communication, manufacturing."
}
]
เชนเชตเซ เชเชชเชฃเซ เชเซเชตเซเช เชฐเชฟเชธเซเชฐเซเชธ เชเซเชฒเชพเชธ เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเซ เช เชฎเชพเชฐเชพ API เชเชจเซเชกเชชเซเชเชจเซเชเชจเซ เชเชพเชฎเชเซเชฐเซเชจเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเชถเซ. เชตเชฐเซเชเชจเซ เช เชเชฆเชฐ เชเชพเชฐ เชชเชฆเซเชงเชคเชฟเช เชเชพเชนเซเชฐ เชเชฐเชตเซ เชเชตเชถเซเชฏเช เชเซ: เชฎเซเชณเชตเซ, เชชเซเชธเซเช เชเชฐเซ, เชชเซเช เชเชฐเซ, เชเชพเชขเซ เชจเชพเชเซ.
เชเชพเชฒเซ GET เชชเชฆเซเชงเชคเชฟเชฅเซ เชถเชฐเซเชเชค เชเชฐเซเช
เชคเซ เชคเชฎเชจเซ เชคเซเชจเซเช ID เชธเซเชชเชทเซเช เชเชฐเซเชจเซ เชเซเชเซเชเชธ เชเซเชตเซเช เชฎเซเชณเชตเชตเชพเชจเซ เชชเชฐเชตเชพเชจเชเซ เชเชชเซ เชเซ, เช เชฅเชตเชพ เชเซ เชเซเช ID เชเชฒเซเชฒเซเชเชฟเชค เชจ เชนเซเชฏ เชคเซ เชฐเซเชจเซเชกเชฎ เชเซเชตเซเช.
class Quote(Resource):
def get(self, id=0):
if id == 0:
return random.choice(ai_quotes), 200
for quote in ai_quotes:
if(quote["id"] == id):
return quote, 200
return "Quote not found", 404
เชเซ IDเชฎเชพเช เชกเชฟเชซเซเชฒเซเช เชฎเซเชฒเซเชฏ เชนเซเชฏ เชคเซ GET เชชเชฆเซเชงเชคเชฟ เชฐเซเชจเซเชกเชฎ เชเซเชตเซเช เชเชชเซ เชเซ, เชเชเชฒเซ เชเซ. เชชเชฆเซเชงเชคเชฟเชจเซ เชเซเชฒ เชเชฐเชคเซ เชตเชเชคเซ ID เชธเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชจ เชนเชคเซ.
เชเซ เชคเซ เชธเซเช เชเชฐเซเชฒ เชนเซเชฏ, เชคเซ เชชเชฆเซเชงเชคเชฟ เช เชตเชคเชฐเชฃเซ เชตเชเซเชเซ เชถเซเชงเซ เชเซ เช เชจเซ เชเชชเซเชฒ ID เชธเชฎเชพเชตเซ เชเซ เชคเซ เชถเซเชงเซ เชเซ. เชเซ เชเชเช เชจ เชฎเชณเซ, เชคเซ เชธเชเชฆเซเชถ "เชเซเชตเซเช เชฎเชณเซเชฏเซ เชจเชฅเซ, 404" เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชพเชฏ เชเซ.
เชฏเชพเชฆ เชฐเชพเชเซ, เชเซ เชตเชฟเชจเชเชคเชฟ เชธเชซเชณ เชฅเช เชนเซเชฏ เชคเซ เชชเชฆเซเชงเชคเชฟ 200 เชจเซ HTTP เชธเซเชฅเชฟเชคเชฟ เชเชชเซ เชเซ เช เชจเซ เชเซ เชเชจเซเชเซเชฐเซ เชจ เชฎเชณเซ เชนเซเชฏ เชคเซ 404.
เชนเชตเซ เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช เชจเชตเซ เชเซเชตเซเช เชเชฎเซเชฐเชตเชพ เชฎเชพเชเซ POST เชชเชฆเซเชงเชคเชฟ เชฌเชจเชพเชตเซเช
เชคเชฎเซ เชเซเชฎ เชเชพเชเชช เชเชฐเชถเซ เชคเซเชฎ เชคเซเชจเซ เชฆเชฐเซเช เชจเชตเชพ เชเซเชตเซเชเชจเซเช เชเชเชกเซ เชฎเชณเชถเซ. เชตเชงเซเชฎเชพเช, POST เช เชชเชฐเชฟเชฎเชพเชฃเซเชจเซ เชชเชพเชฐเซเชธ เชเชฐเชตเชพ เชฎเชพเชเซ reqparse เชจเซ เชเชชเชฏเซเช เชเชฐเชถเซ เชเซ เชตเชฟเชจเชเชคเซเชจเชพ เชฎเซเชเซเชฏ เชญเชพเชเชฎเชพเช เชเชถเซ (เชฒเซเชเช เช เชจเซ เชเซเชตเซเช เชเซเชเซเชธเซเช).
def post(self, id):
parser = reqparse.RequestParser()
parser.add_argument("author")
parser.add_argument("quote")
params = parser.parse_args()
for quote in ai_quotes:
if(id == quote["id"]):
return f"Quote with id {id} already exists", 400
quote = {
"id": int(id),
"author": params["author"],
"quote": params["quote"]
}
ai_quotes.append(quote)
return quote, 201
เชเชชเชฐเชจเชพ เชเซเชกเชฎเชพเช, POST เชชเชฆเซเชงเชคเชฟเช เชเซเชตเซเช ID เชธเซเชตเซเชเชพเชฐเซเชฏเซเช เชเซ. เชชเชเซ, reqparse เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เชคเซเชฃเซ เชตเชฟเชจเชเชคเซเชฎเชพเชเชฅเซ เชฒเซเชเช เช เชจเซ เช เชตเชคเชฐเชฃ เชฎเซเชณเชตเซเชฏเชพ, เชคเซเชฎเชจเซ params เชถเชฌเซเชฆเชเซเชถเชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเซเชฏเชพ.
เชเซ เชเชฒเซเชฒเซเชเชฟเชค ID เชธเชพเชฅเซเชจเซ เช เชตเชคเชฐเชฃ เชชเชนเซเชฒเซเชฅเซ เช เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชเซ, เชคเซ เชชเชฆเซเชงเชคเชฟ เชฏเซเชเซเชฏ เชธเชเชฆเซเชถ เช เชจเซ เชเซเชก 400 เชฆเชฐเซเชถเชพเชตเซ เชเซ.
เชเซ เชเชฒเซเชฒเซเชเชฟเชค ID เชธเชพเชฅเซเชจเซ เช เชตเชคเชฐเชฃ เชนเชเซ เชธเซเชงเซ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชจเชฅเซ, เชคเซ เชชเชฆเซเชงเชคเชฟ เชเชฒเซเชฒเซเชเชฟเชค ID เช เชจเซ เชฒเซเชเช เชคเซเชฎเช เช เชจเซเชฏ เชชเชฐเชฟเชฎเชพเชฃเซ เชธเชพเชฅเซ เชจเชตเซ เชเชจเซเชเซเชฐเซ เชฌเชจเชพเชตเซ เชเซ. เชคเซ เชชเชเซ ai_quotes เชธเซเชเชฟเชฎเชพเช เชเชจเซเชเซเชฐเซ เชเชฎเซเชฐเซ เชเซ เช เชจเซ 201 เชเซเชก เชธเชพเชฅเซ เชจเชตเชพ เชเซเชตเซเช เชธเชพเชฅเซ เชเชจเซเชเซเชฐเซ เชชเชฐเชค เชเชฐเซ เชเซ.
เชนเชตเซ เชเชชเชฃเซ เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช เชนเชพเชฒเชจเชพ เช เชตเชคเชฐเชฃเชจเซ เชฌเชฆเชฒเชตเชพ เชฎเชพเชเซ PUT เชชเชฆเซเชงเชคเชฟ เชฌเชจเชพเชตเซเช เชเซเช
def put(self, id):
parser = reqparse.RequestParser()
parser.add_argument("author")
parser.add_argument("quote")
params = parser.parse_args()
for quote in ai_quotes:
if(id == quote["id"]):
quote["author"] = params["author"]
quote["quote"] = params["quote"]
return quote, 200
quote = {
"id": id,
"author": params["author"],
"quote": params["quote"]
}
ai_quotes.append(quote)
return quote, 201
เช เชเชพเชเชจเชพ เชเชฆเชพเชนเชฐเชฃเชจเซ เชเซเชฎ เช PUT เชชเชฆเซเชงเชคเชฟ, ID เช เชจเซ เชเชจเชชเซเช เชฒเซ เชเซ เช เชจเซ reqparse เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเซเชตเซเช เชชเชฐเชฟเชฎเชพเชฃเซเชจเซ เชชเชพเชฐเซเชธ เชเชฐเซ เชเซ.
เชเซ เชเชฒเซเชฒเซเชเชฟเชค ID เชธเชพเชฅเซ เช เชตเชคเชฐเชฃ เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชเซ, เชคเซ เชชเชฆเซเชงเชคเชฟ เชคเซเชจเซ เชจเชตเชพ เชชเชฐเชฟเชฎเชพเชฃเซ เชธเชพเชฅเซ เช เชชเชกเซเช เชเชฐเชถเซ เช เชจเซ เชชเชเซ เชเซเชก 200 เชธเชพเชฅเซ เช เชชเชกเซเช เชเชฐเซเชฒ เชเซเชตเซเช เชเชเชเชชเซเช เชเชฐเชถเซ. เชเซ เชนเชเซ เชธเซเชงเซ เชเชฒเซเชฒเซเชเชฟเชค ID เชธเชพเชฅเซ เชเซเช เช เชตเชคเชฐเชฃ เชจเชฅเซ, เชคเซ เชเซเชก 201 เชธเชพเชฅเซ เชจเชตเซ เชฐเซเชเซเชฐเซเชก เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ.
เชเซเชฒเซเชฒเซ, เชเชพเชฒเซ เชนเชตเซ เชชเซเชฐเซเชฐเชฃเชพเชฆเชพเชฏเช เชจ เชนเซเชฏ เชคเซเชตเชพ เช เชตเชคเชฐเชฃเชจเซ เชฆเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ DELETE เชชเชฆเซเชงเชคเชฟ เชฌเชจเชพเชตเซเช.
def delete(self, id):
global ai_quotes
ai_quotes = [qoute for qoute in ai_quotes if qoute["id"] != id]
return f"Quote with id {id} is deleted.", 200
เช เชชเชฆเซเชงเชคเชฟ เชเชจเชชเซเช เชคเชฐเซเชเซ เชเซเชตเซเช ID เชฒเซ เชเซ เช เชจเซ เชถเซเชฐ เชเชฐเซเชฒ เชธเซเชเชฟเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ ai_quotesเชจเซ เชธเซเชเชฟเชจเซ เช เชชเชกเซเช เชเชฐเซ เชเซ.
เชนเชตเซ เช เชฎเซ เชฌเชงเซ เชชเชฆเซเชงเชคเชฟเช เชฌเชจเชพเชตเซ เชฒเซเชงเซ เชเซ, เช เชฎเชพเชฐเซ เชซเชเซเชค เชเชชเซเชเชเชฎเชพเช เชธเชเชธเชพเชงเชจ เชเชฎเซเชฐเชตเชพ, เชชเชพเชฅ เชธเซเช เชเชฐเชตเชพ เช เชจเซ เชซเซเชฒเชพเชธเซเช เชเชฒเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
app.run(debug=True)
เช เชฎเชพเชฐเซ REST API เชธเซเชตเชพ เชคเซเชฏเชพเชฐ เชเซ!
เชเชเชณ, เช เชฎเซ เชเซเชกเชจเซ เชเชจเซเชธเซเชฒเชฎเชพเช เชเชฆเซเชถ เชธเชพเชฅเซ เชเชฒเชพเชตเซเชจเซ app.py เชซเชพเชเชฒเชฎเชพเช เชธเชพเชเชตเซ เชถเชเซเช เชเซเช:
python3 app.py
เชเซ เชฌเชงเซเช เชฌเชฐเชพเชฌเชฐ เชเซ, เชคเซ เชเชชเชฃเชจเซ เชเชจเชพ เชเซเชตเซเช เชเชเชเช เชฎเชณเชถเซ:
* เชกเซเชฌเช เชฎเซเชก: เชเชพเชฒเซ
* เชเชพเชฒเซ เชฐเชนเซ เชเซ
* เชธเซเชเซเช เชธเชพเชฅเซ เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญ
* เชกเซเชฌเชเชฐ เชธเชเซเชฐเชฟเชฏ เชเซ!
* เชกเซเชฌเชเชฐ เชชเชฟเชจ: XXXXXXX
API เชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ
API เชฌเชจเชพเชตเซเชฏเชพ เชชเชเซ, เชคเซเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เช curl เชเชจเซเชธเซเชฒ เชเชชเชฏเซเชเชฟเชคเชพ เช เชฅเชตเชพ เช เชจเชฟเชฆเซเชฐเชพ REST เชเซเชฒเชพเชฏเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เช เชฅเชตเชพ Rapid API เชชเชฐ API เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเซเชจเซ เชเชฐเซ เชถเชเชพเชฏ เชเซ.
เช
เชฎเชพเชฐเชพ API เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
RapidAPI เช 10 เชฅเซ เชตเชงเซ API (เช เชจเซ เชฒเชเชญเช 000 เชฎเชฟเชฒเชฟเชฏเชจ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช) เชธเชพเชฅเซ เชตเชฟเชถเซเชตเชจเซเช เชธเซเชฅเซ เชฎเซเชเซเช เชฎเชพเชฐเซเชเซเชเชชเซเชฒเซเชธ เชเซ.
RapidAPI เชคเซเชคเซเชฏ-เชชเชเซเชท API เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เชฎเชพเชคเซเชฐ เชเช เช เชเชจเซเชเชฐเชซเซเชธ เชชเซเชฐเชฆเชพเชจ เชเชฐเชคเซเช เชจเชฅเซ, เชชเชฃ เชคเชฎเชจเซ เชคเชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ APIเชจเซ เชเชกเชชเชฅเซ เช เชจเซ เชธเชฐเชณเชคเชพเชฅเซ เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเชตเชพเชจเซ เชชเชฃ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ.
เชฎเชพเชเซ
Heroku เชชเชฐ เชคเชฎเชพเชฐเซเช API เชเซเชตเซ เชฐเซเชคเซ เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเชตเซเช
1. Heroku เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ.
เชชเซเชฐเชฅเชฎ เชชเชเชฒเซเช Heroku เชเชฎเชพเชจเซเชก เชฒเชพเชเชจ เชเชจเซเชเชฐเชซเซเชธ (CLI) เชจเซ เชจเซเชเชงเชฃเซ เช เชจเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซเช เชเซ. เช Ubuntu 16+ เชชเชฐ เชเชพเชฎ เชเชฐเซ เชเซ.
sudo snap install heroku --classic
เชชเชเซ เช เชฎเซ เชฒเซเช เชเชจ เชเชฐเซเช เชเซเช:
heroku เชฒเซเชเชฟเชจ
2. เชเชฐเซเชฐเซ เชซเชพเชเชฒเซ เชเชฎเซเชฐเซ.
เชนเชตเซ เช เชฎเชพเชฐเซ เช เชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชฎเชพเช เชซเซเชฒเซเชกเชฐเชฎเชพเช เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชซเชพเชเชฒเซ เชเชฎเซเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
- เชเชฐเซเชฐเซ เชชเชพเชฏเชฅเซเชจ เชฎเซเชกเซเชฏเซเชฒเซเชจเซ เชฏเชพเชฆเซ เชธเชพเชฅเซ requirements.txt;
- Procfile, เชเซ เชธเซเชชเชทเซเช เชเชฐเซ เชเซ เชเซ เชเชชเซเชฒเซเชเซเชถเชจ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ เชเชฏเชพ เชเชฆเซเชถเซ เช เชฎเชฒเชฎเชพเช เชฎเซเชเชตเชพ เชเซเชเช;
- .gitignore - เชธเชฐเซเชตเชฐ เชชเชฐ เชเชฐเซเชฐเซ เชจ เชนเซเชฏ เชคเซเชตเซ เชซเชพเชเชฒเซเชจเซ เชฌเชพเชเชพเชค เชฐเชพเชเชตเชพ เชฎเชพเชเซ.
requirements.txt เชซเชพเชเชฒเชฎเชพเช เชจเซเชเซเชจเซ เชฒเซเชเซเช เชนเชถเซ:
- เชซเซเชฒเชพเชธเซเช
- เชซเซเชฒเชพเชธเซเช-เชเชฐเชพเชฎเชฆเชพเชฏเช
- เชเชจเชเซเชฐเซเชจ
เชฎเชนเซเชฐเชฌเชพเชจเซ เชเชฐเซเชจเซ เชจเซเชเชง เชเชฐเซ เชเซ เช เชฎเซ เชธเซเชเชฟเชฎเชพเช gunicorn (Python WSGI HTTP เชธเชฐเซเชตเชฐ) เชเชฎเซเชฐเซเชฏเซเช เชเซ เชเชพเชฐเชฃ เชเซ เช เชฎเชพเชฐเซ เชธเชฐเซเชตเชฐ เชชเชฐ เช เชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชฒเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เชชเซเชฐเซเชซเชพเชเชฒเชฎเชพเช เชถเชพเชฎเซเชฒ เชนเชถเซ:
web: gunicorn app:app
.gitignore เชจเซ เชธเชพเชฎเชเซเชฐเซ:
*.pyc
__pycache__/
เชนเชตเซ เชเซเชฏเชพเชฐเซ เชซเชพเชเชฒเซ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเชพเชฒเซ เชเชฟเช เชฐเซเชชเซเชจเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเซเช เช เชจเซ เชเชฎเชฟเช เชเชฐเซเช:
git init
git add
git commit -m "First API commit"
3. เชจเชตเซ Heroku เชเชชเซเชฒเชฟเชเซเชถเชจ เชฌเชจเชพเชตเซ.
heroku create
เชฎเชพเชธเซเชเชฐ เชฌเซเชฐเชพเชจเซเชเชจเซ เชฐเชฟเชฎเซเช เชนเซเชฐเซเชเซ เชฐเซเชชเซ เชชเชฐ เชงเชเซเชฒเชตเซเช:
git push heroku master
เชนเชตเซ เชคเชฎเซ เชเชฆเซเชถเซ เชธเชพเชฅเซ API เชธเซเชตเชพ เชเซเชฒเซเชจเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเซ เชถเชเซ เชเซ:
heroku ps:scale web=1
heroku open
API เชชเชฐ เชเชชเชฒเชฌเซเชง เชฅเชถเซ
เชคเชฎเชพเชฐเชพ เชชเชพเชฏเชฅเซเชจ API เชจเซ RapidAPI เชฎเชพเชฐเซเชเซเชเชชเซเชฒเซเชธเชฎเชพเช เชเซเชตเซ เชฐเซเชคเซ เชเชฎเซเชฐเชตเซเช
เชเชเชตเชพเชฐ API เชธเซเชตเชพ Heroku เชชเชฐ เชชเซเชฐเชเชพเชถเชฟเชค เชฅเช เชเชพเชฏ, เชชเชเซ เชคเชฎเซ เชคเซเชจเซ Rapid API เชฎเชพเช เชเชฎเซเชฐเซ เชถเชเซ เชเซ. เช
เชนเซเช
1. RapidAPI เชเชเชพเชเชจเซเช เชฌเชจเชพเชตเซ.
เช
เชฎเซ เชเช เชฎเชซเชค เชเชเชพเชเชจเซเช เชฐเชเซเชธเซเชเชฐ เชเชฐเซเช เชเซเช - เช เชซเซเชธเชฌเซเช, เชเซเชเชฒ, เชเชฟเชเชนเชฌเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชฐเซ เชถเชเชพเชฏ เชเซ.
2. เชเชเชเซเชฐเซเชฒ เชชเซเชจเชฒเชฎเชพเช API เชเชฎเซเชฐเซ.
3. เชเชเชณ, เชคเชฎเชพเชฐเชพ API เชตเชฟเชถเซ เชธเชพเชฎเชพเชจเซเชฏ เชฎเชพเชนเชฟเชคเซ เชฆเชพเชเชฒ เชเชฐเซ.
4. "Add API" เชชเชฐ เชเซเชฒเชฟเช เชเชฐเซเชฏเชพ เชชเชเซ เชเช เชจเชตเซเช เชชเซเชทเซเช เชฆเซเชเชพเชฏ เชเซ เชเซเชฏเชพเช เชคเชฎเซ เช
เชฎเชพเชฐเชพ API เชตเชฟเชถเซ เชฎเชพเชนเชฟเชคเซ เชฆเชพเชเชฒ เชเชฐเซ เชถเชเซ เชเซ.
5. เชนเชตเซ เชคเชฎเซ เชฎเซเชจเซเชฏเซเช
เชฒเซ API เชเชจเซเชกเชชเซเชเชจเซเช เชฆเชพเชเชฒ เชเชฐเซ เชถเชเซ เชเซ เช
เชฅเชตเชพ เชกเชพเชเชจเชฒเซเชก เชเชฐเซ เชถเชเซ เชเซ
เชธเชพเชฐเซเช, เชนเชตเซ เชคเชฎเชพเชฐเซ เชเชจเซเชกเชชเซเชเชจเซเชเซเชธ เชชเซเชทเซเช เชชเชฐ เช
เชฎเชพเชฐเชพ API เชจเชพ เช
เชเชคเชฟเชฎ เชฌเชฟเชเชฆเซเช เชธเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เช
เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เช
เชเชคเชฟเชฎ เชฌเชฟเชเชฆเซเช CRUD (เชฎเซเชณเชตเซ, เชชเซเชธเซเช เชเชฐเซ, เชฎเซเชเซ, เชเชพเชขเซ เชจเชพเชเซ) เชจเชพ เชเซเชฏเชพเชฒเชจเซ เช
เชจเซเชฐเซเชช เชเซ.
เชเชเชณ, เชคเชฎเชพเชฐเซ เชเช GET AI เชเซเชตเซเช เชเชจเซเชกเชชเซเชเชจเซเช เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเซ เชฐเซเชจเซเชกเชฎ เชเซเชตเซเช (เชเซ ID เชกเชฟเชซเซเชฒเซเช เชนเซเชฏ เชคเซ) เช
เชฅเชตเชพ เชเชฒเซเชฒเซเชเชฟเชค ID เชฎเชพเชเซ เชเซเชตเซเช เชฆเชฐเซเชถเชพเชตเซ เชเซ.
เชเชจเซเชกเชชเซเชเชจเซเช เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ "เชเชจเซเชกเชชเซเชเชจเซเช เชฌเชจเชพเชตเซ" เชฌเชเชจเชจเซ เชเซเชฒเชฟเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เช
เชฎเซ เช เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เช
เชจเซเชฏ เชคเชฎเชพเชฎ API เชเชจเซเชกเชชเซเชเชจเซเช เชฎเชพเชเซ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชเชฐเซเช เชเซเช. เชฌเชธ เชเชเชฒเซเช เช! เช
เชญเชฟเชจเชเชฆเชจ, เชคเชฎเซ เชคเชฎเชพเชฐเซเช API เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเซเชฏเซเช เชเซ!
เชเซ เชฌเชงเซเช เชฌเชฐเชพเชฌเชฐ เชเชพเชฒเซ เชเซ, เชคเซ API เชชเซเชทเซเช เชเชเชเช เชเชจเชพ เชเซเชตเซเช เชฆเซเชเชพเชถเซ:
เชจเชฟเชทเซเชเชฐเซเชท
เช เชฒเซเชเชฎเชพเช, เช เชฎเซ เชชเชพเชฏเชฅเซเชจเชฎเชพเช เช เชฎเชพเชฐเซ เชชเซเชคเชพเชจเซ RESTful API เชธเซเชตเชพ เชฌเชจเชพเชตเชตเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชธเชพเชฅเซ, Heroku เชเซเชฒเชพเชเชก เชชเชฐ API เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเชตเชพเชจเซ เช เชจเซ เชคเซเชจเซ RapidAPI เชกเชฟเชฐเซเชเซเชเชฐเซเชฎเชพเช เชเชฎเซเชฐเชตเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเชเชฅเซ เชชเชธเชพเชฐ เชฅเชฏเชพ.
เชชเชฐเชเชคเซ เชชเชฐเซเชเซเชทเชฃ เชธเชเชธเซเชเชฐเชฃเชฎเชพเช, API เชตเชฟเชเชพเชธเชจเชพ เชซเชเซเชค เชฎเซเชณเชญเซเชค เชธเชฟเชฆเซเชงเชพเชเชคเซ เชฆเชฐเซเชถเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชนเชคเชพ - เชธเซเชฐเชเซเชทเชพ, เชเชพเชฎเซ เชธเชนเชฟเชทเซเชฃเซเชคเชพ เช เชจเซ เชฎเชพเชชเชจเซเชฏเชคเชพ เชเซเชตเซ เชเซเชเชเชพเช เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชตเชพเชฎเชพเช เชเชตเซ เชจ เชนเชคเซ.
เชตเชพเชธเซเชคเชตเชฟเช API เชตเชฟเชเชธเชพเชตเชคเซ เชตเชเชคเซ, เช เชฌเชงเซเช เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชตเซเช เชเชตเชถเซเชฏเช เชเซ.
เชธเซเชฐเซเชธ: www.habr.com