{"id":336922,"date":"2022-08-12T09:00:08","date_gmt":"2022-08-12T09:00:08","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=336922"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=336922","title":{"rendered":"<span>\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0435\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 HTTP<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/484\/033\/688\/4840336886dc98b59f63648f40170f22.png\" width=\"2860\" height=\"1355\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/484\/033\/688\/4840336886dc98b59f63648f40170f22.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u042f \u0447\u0430\u0441\u0442\u043e \u043f\u0443\u0442\u0430\u044e \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b \u0431\u044b \u044d\u0442\u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442.<\/p>\n<p>\u0422\u0435\u0440\u043c\u0438\u043d\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0441\u043f\u043b\u044b\u0432\u0447\u0430\u0442\u044b, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u044d\u043a\u0435\u043d\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u042f \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043b \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445. \u0412 \u0434\u043e\u0431\u0430\u0432\u043e\u043a \u044d\u0442\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u041f\u0440\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0441 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0447\u0430\u0441\u0442\u043e.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0434 \u0431\u044d\u043a\u0435\u043d\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 API \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 HTTP. \u041c\u043d\u0435, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443, \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 REST API \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u0432\u0435\u0431 \u0441\u0442\u0440\u0430\u043d\u0438\u0446. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0435\u0440\u0435\u043c Flask \u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0438\u0448\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 \u0441 API \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430. \u0418\u043b\u0438 \u0431\u0435\u0440\u0435\u043c django \u0438 django-rest-framework \u0438 \u043f\u0438\u0448\u0435\u043c REST API \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0430. \u0412\u043e \u0432\u0441\u0435\u0445 \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c, \u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0435\u0439. \u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 JWT, Oauth. \u0418 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0432\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u043a \u0433\u0443\u0433\u043b\u0435\u043d\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432.<\/p>\n<p>\u00a0\u042f \u0436\u0435 \u0445\u043e\u0447\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u044d\u0442\u0430\u043f\u043d\u043e \u0440\u0430\u0441\u043a\u0440\u043e\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0437\u043d\u0430\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u0447\u0435 \u0440\u0435\u0448\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u044d\u0442\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0438. \u042f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043b\u043e\u0431 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u044d\u0442\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u044b. \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u0442\u0438\u043b\u0435, \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u0432\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435\u0441\u044c \u0443 \u0438\u0441\u0442\u043e\u043a\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u0432\u043e\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434.<\/p>\n<h2>\u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043e\u043a<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441 API \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u0442\u043e\u043a. \u041d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u0430\u043f \u043a\u0440\u0435\u043c\u043d\u0438\u0435\u0432\u043e\u0439 \u0434\u043e\u043b\u0438\u043d\u044b. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 Flask, \u0411\u0414 \u2013 sqlite, \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0411\u0414 \u0447\u0435\u0440\u0435\u0437 ORM \u2013 SQLAlchemy.\u00a0 <\/p>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u043c. \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u2013 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a(varchar 256) \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435(text).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/d5a\/8b1\/4ee\/d5a8b14ee48b227c4ac92b145443a67a.jpeg\" alt=\"\u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438\" title=\"\u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d5a\/8b1\/4ee\/d5a8b14ee48b227c4ac92b145443a67a.jpeg\" data-blurred=\"true\"\/><figcaption>\u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/figcaption><\/figure>\n<pre><code class=\"python\"># models.py class Note(db.Model):     id = db.Column(db.Integer, primary_key=True)     title = db.Column(db.String(256))     body = db.Column(db.Text)      def __repr__(self):         return '&lt;Note %r>' % self.title<\/code><\/pre>\n<p>\u0412\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e create_note \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 HTTP \u043e\u0442\u0432\u0435\u0442 \u0441 \u043a\u043e\u0434\u043e\u043c 201 CREATED \u0438 json, \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0435. \u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0442\u0443\u0441? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u00a0 REST API.\u00a0 <\/p>\n<p>\u042d\u0442\u043e\u0442 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043b\u044e\u0431\u043e\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u043e\u0439, \u0443 \u043a\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442 \u00a0\u0432\u0430\u0448 \u0434\u0440\u0443\u0433 \u0412\u043e\u0432\u0430\u043d.\u00a0 \u0412\u043e\u0432\u0430\u043d \u0441\u0430\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 HTTP \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0448\u043b\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0417\u0430\u043c\u0435\u0442\u043a\u0430 \u0412\u043e\u0432\u0430\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/5c3\/994\/63e\/5c399463e79281696c1426d6022f2c51.jpeg\" alt=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441  \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f  \u0437\u0430\u043c\u0435\u0442\u043a\u0438\" title=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441  \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f  \u0437\u0430\u043c\u0435\u0442\u043a\u0438\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5c3\/994\/63e\/5c399463e79281696c1426d6022f2c51.jpeg\" data-blurred=\"true\"\/><figcaption>\u041f\u0440\u043e\u0446\u0435\u0441\u0441  \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f  \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/figcaption><\/figure>\n<pre><code class=\"python\"># main.py from flask import request, jsonify  import services as notes_service from app import app   @app.route(\"\/notes\", methods=['POST']) def create_note():     note = notes_service.create_note(request=request)     response = make_response(         jsonify(             {                 'title': note.title,                 'body': note.body,             }         ), 201     )     response.headers[\"Content-Type\"] = \"application\/json\"     return response <\/code><\/pre>\n<p>\u0412\u043e\u0432\u0430\u043d \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0437\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0430 \u2013 \u0414\u0438\u043c\u043e\u043d\u0430. \u0414\u0438\u043c\u043e\u043d \u0441\u0430\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 HTTP \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0442\u043e\u0436\u0435 \u0448\u043b\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0417\u0430\u0442\u0435\u043c \u0432\u044b \u0432\u043c\u0435\u0441\u0442\u0435 \u043b\u044e\u0431\u0443\u0435\u0442\u0435\u0441\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c\u0438 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432\u044b \u0441 \u0412\u043e\u0432\u0430\u043d\u043e\u043c \u0438 \u0414\u0438\u043c\u0430\u043d\u043e\u043c \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e<br \/> \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u0430\u043f. \u0412\u043e\u0432\u0430\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043a\u043b\u0430\u0434\u0443\u0442\u0441\u044f \u0432<br \/> \u043e\u0431\u0449\u0443\u044e \u043a\u0443\u0447\u0443 \u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0442\u043e \u043a\u0430\u043a\u0443\u044e \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043b. \u041d\u043e\u0432\u044b\u0435 \u044e\u0437\u0435\u0440\u044b \u0442\u043e\u0447\u043d\u043e<br \/> \u0442\u0430\u043a \u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u043b\u0430\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0432 \u043e\u0431\u0449\u0443\u044e \u043a\u0443\u0447\u0443. \u0420\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0442\u043e \u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u0431\u0443\u0434\u0435\u0442<br \/> \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/35b\/7f9\/3d6\/35b7f93d67a6432211cbf6c3785d0f40.jpeg\" alt=\"\u0420\u0430\u0437\u043d\u044b\u0435 \u043b\u044e\u0434\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442  \u0441\u0435\u0440\u0432\u0438\u0441\" title=\"\u0420\u0430\u0437\u043d\u044b\u0435 \u043b\u044e\u0434\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442  \u0441\u0435\u0440\u0432\u0438\u0441\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/35b\/7f9\/3d6\/35b7f93d67a6432211cbf6c3785d0f40.jpeg\" data-blurred=\"true\"\/><figcaption>\u0420\u0430\u0437\u043d\u044b\u0435 \u043b\u044e\u0434\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442  \u0441\u0435\u0440\u0432\u0438\u0441<\/figcaption><\/figure>\n<h2>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0412\u044b \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435:<br \/> &#8212; \u041a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0437\u0430\u043c\u0435\u0442\u043a\u0443?<\/p>\n<p>&#8212; \u041d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0443.<\/p>\n<p>&#8212; \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e \u0438\u043c\u0435\u043d\u0438? <\/p>\n<p>&#8212; \u0427\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u043e\u0433\u043e, \u043d\u043e \u0438\u043c\u044f \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c<\/p>\n<p>&#8212; \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c. \u041f\u0443\u0441\u0442\u044c \u0414\u0438\u043c\u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d dimon.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0442\u043e \u0432 \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u043b\u044e\u0434\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u043e\u0439. \u042d\u0442\u0438 \u043b\u044e\u0434\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u0435  \u0434\u0435\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443\/\u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041d\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c, \u043f\u0440\u0438\u0447\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/bba\/fac\/10a\/bbafac10af88eaedeba162d205816828.jpeg\" alt=\"\u041d\u043e\u0432\u0430\u044f  \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c. \u041d\u0430\u0432\u0435\u0448\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\" title=\"\u041d\u043e\u0432\u0430\u044f  \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c. \u041d\u0430\u0432\u0435\u0448\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bba\/fac\/10a\/bbafac10af88eaedeba162d205816828.jpeg\" data-blurred=\"true\"\/><figcaption>\u041d\u043e\u0432\u0430\u044f  \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c. \u041d\u0430\u0432\u0435\u0448\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c<\/figcaption><\/figure>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, username \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<pre><code class=\"python\">from db import db   class User(db.Model):     id = db.Column(db.Integer, primary_key=True)     username = db.Column(db.String(120), unique=True, nullable=False)      def __repr__(self):         return '&lt;User %r>' % self.username   class Note(db.Model):     id = db.Column(db.Integer, primary_key=True)     title = db.Column(db.String(256))     body = db.Column(db.Text)      def __repr__(self):         return '&lt;Note %r>' % self.title <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 \u043f\u0430\u0440\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0437\u0430\u043d\u043e\u0441\u0438\u0442\u0435 \u0442\u0443\u0434\u0430 2 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u2013 dimon_01 \u0438 vovan.\u00a0 \u041d\u0430\u0448\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u043d\u0430\u0435\u0442 \u043e\u0431 \u044d\u0442\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u0445.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0430\u0432\u0442\u043e\u0440\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0438. \u0422\u0430\u043a\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c &#8212;\u00a0 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u0435\u0442\u043e\u043a.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/93d\/d56\/bf0\/93dd56bf02d1920fb683ee6137e78472.jpeg\" alt=\"\u041d\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0441\u0432\u044f\u0437\u0438\" title=\"\u041d\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0441\u0432\u044f\u0437\u0438\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/93d\/d56\/bf0\/93dd56bf02d1920fb683ee6137e78472.jpeg\" data-blurred=\"true\"\/><figcaption>\u041d\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0441\u0432\u044f\u0437\u0438<\/figcaption><\/figure>\n<pre><code class=\"python\"># models.py from db import db   class User(db.Model):     id = db.Column(db.Integer, primary_key=True)     username = db.Column(db.String(120), unique=True, nullable=False)      def __repr__(self):         return '&lt;User %r>' % self.username   class Note(db.Model):     id = db.Column(db.Integer, primary_key=True)     title = db.Column(db.String(256))     body = db.Column(db.Text)     user_id = db.Column(         db.Integer, db.ForeignKey('user.id'),         nullable=False     )     user = db.relationship(         'User',         backref=db.backref('notes', lazy=True)     )      def __repr__(self):         return '&lt;Note %r>' % self.title <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0411\u0414, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043a\u0430\u043a-\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435(username) \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 json \u043f\u043e\u043c\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0435(\u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442\u0435\u043b\u043e) \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u043e\u043b\u0435 credentials. \u0412 \u043a\u043e\u0434\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0438\u0449\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0411\u0414 \u043f\u043e \u0435\u0433\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u0443. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0434\u0435\u043d \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u044e\u0437\u0435\u0440\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e create_note, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u0430. <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0435\u0433\u043e \u0432 \u0411\u0414, \u044d\u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/388\/af4\/b26\/388af4b26a74652e17ed172acbb98ed0.jpeg\" alt=\"\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0412\u043e\u0432\u0430\u043d\u0430\" title=\"\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0412\u043e\u0432\u0430\u043d\u0430\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/388\/af4\/b26\/388af4b26a74652e17ed172acbb98ed0.jpeg\" data-blurred=\"true\"\/><figcaption>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0412\u043e\u0432\u0430\u043d\u0430<\/figcaption><\/figure>\n<pre><code class=\"python\"># main.py from typing import Optional  from flask import request, jsonify  import services as notes_service from app import app from models import User   def identify_user(credentials: Optional[dict]) -> Optional[User]:     if credentials is None:         return None      username = credentials.get('username')     user = User.query.filter_by(username=username).first()      return user   @app.route(\"\/notes\", methods=['POST']) def create_note_api():     credentials = request.json().get('credentials')     user = identify_user(credentials=credentials)      note = notes_service.create_note(request=request, user=user)     response = make_response(         jsonify(             {                 'title': note.title,                 'body': note.body,             }         ), 201     )     response.headers[\"Content-Type\"] = \"application\/json\"     return response <\/code><\/pre>\n<pre><code class=\"python\"># services.py from flask import Request  from db import db from models import Note, User   def create_note(request: Request, user: User) -> Note:     note = Note(         title=request.json['title'],         body=request.json['body'],         user=user,     )     db.session.add(note)     db.session.commit()      return note <\/code><\/pre>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438 \u0438 \u0432\u0438\u043a\u0438\u0441\u043b\u043e\u0432\u0430\u0440\u044f<\/p>\n<p>\u0412\u0438\u043a\u0438\u0441\u043b\u043e\u0432\u0430\u0440\u044c:<\/p>\n<blockquote>\n<p><a href=\"https:\/\/ru.wiktionary.org\/wiki\/%D0%92%D0%B8%D0%BA%D0%B8%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D1%80%D1%8C:%D0%A3%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D1%81%D0%BE%D0%BA%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\"><em>\u043a\u043e\u043c\u043f.<\/em><\/a> \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445) \u043f\u0443\u0442\u0451\u043c <a href=\"https:\/\/ru.wiktionary.org\/wiki\/%D0%BF%D1%80%D0%B8%D1%81%D0%B2%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f<\/a> \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043b\u0438\u0431\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441 \u043f\u0435\u0440\u0435\u0447\u043d\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432<\/p>\n<\/blockquote>\n<p>\u00a0<br \/>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f:<\/p>\n<blockquote>\n<p> <strong>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0301\u0446\u0438\u044f<\/strong> \u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445\u00a0\u2014 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043b\u044f \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u044b\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0433\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80\" rel=\"noopener noreferrer nofollow\">\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440<\/a>, \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435<\/a>. \u0414\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0443 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 (\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435). <\/p>\n<\/blockquote>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043b\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0432 \u0432\u0438\u0434\u0435 \u0438\u0445 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u0432(username), \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u0445, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0411\u0414. \u041f\u043e\u0438\u0441\u043a \u0432 \u0411\u0414 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u0435\u0440\u0435\u0447\u043d\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432(\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u0437 \u0432\u0438\u043a\u0438\u0441\u043b\u043e\u0432\u0430\u0440\u044f)<\/p>\n<h2>\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0435\u0431\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u0432 credentials \u043e\u0442\u043e\u0448\u043b\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 username, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0412\u043e\u0432\u0430\u043d. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/a0e\/3b0\/453\/a0e3b0453d151edd2d263cbe2b7aa62d.jpeg\" alt=\"\u041a\u0442\u043e-\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0412\u043e\u0432\u0430\u043d\u043e\u043c\" title=\"\u041a\u0442\u043e-\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0412\u043e\u0432\u0430\u043d\u043e\u043c\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a0e\/3b0\/453\/a0e3b0453d151edd2d263cbe2b7aa62d.jpeg\" data-blurred=\"true\"\/><figcaption>\u041a\u0442\u043e-\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0412\u043e\u0432\u0430\u043d\u043e\u043c<\/figcaption><\/figure>\n<p>\u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u043e\u0441\u0442 \u2013 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0412\u043e\u0432\u0430\u043d\u0430. \u042d\u0442\u043e \u0434\u044b\u0440\u0430 \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0412\u043e\u0432\u0430\u043d\u043e\u043c(prove user\u2019s identity). <\/p>\n<p>\u0412\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u0435\u0442\u0435, \u043a\u0430\u043a \u0412\u043e\u0432\u0430\u043d \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u0438 \u0435\u0441\u0442\u044c \u0412\u043e\u0432\u0430\u043d.<\/p>\n<p>\u0421\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0412\u043e\u0432\u0430\u043d \u044d\u0442\u043e \u0412\u043e\u0432\u0430\u043d, \u0443\u0436\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443 \u043d\u0435\u0433\u043e.\u00a0 \u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0412\u043e\u0432\u0430\u043d\u0430 \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u044e\u0434\u0435\u0439 \u0438 \u0447\u0442\u043e \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d? \u041d\u0430\u0431\u043e\u0440 \u0430\u0442\u043e\u043c\u043e\u0432? \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0414\u041d\u041a?<\/p>\n<p>&#8212; \u0412\u043e\u0432\u0430\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442 \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0435\u0433\u043e \u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u043e\u043b\u043e\u0441\u044b. \u041f\u0443\u0441\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u0438 \u0442\u043e, \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u043e\u043b\u043e\u0441\u044b.<\/p>\n<p>&#8212; \u0410 \u0435\u0449\u0435 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0430\u043a\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0422\u0443\u0437\u0438\u043a.<\/p>\n<p>&#8212; \u0415\u0449\u0435 \u0435\u0433\u043e \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0446\u0432\u0435\u0442 \u2013 \u043a\u0440\u0430\u0441\u043d\u044b\u0439.<\/p>\n<p>&#8212; \u0410 \u0432\u0435\u0434\u044c \u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u0432\u0441\u0435 \u0444\u0430\u043a\u0442\u044b \u043e \u043d\u0435\u043c. \u0415\u0433\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430<\/p>\n<p>&#8212; \u041f\u0443\u0441\u0442\u044c \u0412\u043e\u0432\u0430\u043d \u0441\u0430\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0444\u0430\u043a\u0442 \u043e \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0432\u0435\u0440\u0438\u043b\u0430 \u0435\u043c\u0443. \u041d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u0442 \u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430.<\/p>\n<p>&#8212; \u042d\u0442\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0431\u0443\u0434\u0435\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0444\u0440\u0430\u0437\u0430? \u041e\u0434\u0438\u043d \u0444\u0430\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 <\/p>\n<p>\u0412\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u043a \u043c\u043e\u0434\u0435\u043b\u0438 \u044e\u0437\u0435\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0444\u0430\u043a\u0442, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0443 \u0412\u043e\u0432\u0430\u043d\u0430. \u0412\u044b \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0432 \u0444\u0438\u043b\u044c\u043c\u0430\u0445 \u043b\u044e\u0434\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0444\u0440\u0430\u0437\u044b \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0430\u0440\u043e\u043b\u044f\u043c\u0438. \u0412 \u0434\u043e\u0431\u0430\u0432\u043e\u043a \u0432\u044b \u0443\u0437\u043d\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u0430\u0440\u043e\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0430\u0442\u044c, \u043d\u043e \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u0438 \u0442\u0443\u0442 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/3f7\/afb\/f83\/3f7afbf83b0841a460d3298f2fd85efe.jpeg\" alt=\"\u041c\u043e\u0434\u0435\u043b\u044c \u044e\u0437\u0435\u0440\u0430 \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c\" title=\"\u041c\u043e\u0434\u0435\u043b\u044c \u044e\u0437\u0435\u0440\u0430 \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3f7\/afb\/f83\/3f7afbf83b0841a460d3298f2fd85efe.jpeg\" data-blurred=\"true\"\/><figcaption>\u041c\u043e\u0434\u0435\u043b\u044c \u044e\u0437\u0435\u0440\u0430 \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c<\/figcaption><\/figure>\n<pre><code class=\"python\">from db import db   class User(db.Model):     id = db.Column(db.Integer, primary_key=True)     username = db.Column(db.String(120), unique=True, nullable=False)     password = db.Column(db.String(256))      def __repr__(self):         return '&lt;User %r>' % self.username   class Note(db.Model):     id = db.Column(db.Integer, primary_key=True)     title = db.Column(db.String(256))     body = db.Column(db.Text)     user_id = db.Column(         db.Integer, db.ForeignKey('user.id'),         nullable=False     )     user = db.relationship(         'User',         backref=db.backref('notes', lazy=True)     )      def __repr__(self):         return '&lt;Note %r>' % self.title <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0411\u0414 \u043f\u0430\u0440\u043e\u043b\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u043d\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0434\u043c\u0438\u043d. \u0410\u0434\u043c\u0438\u043d \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043b\u0438\u0447\u043d\u043e \u043f\u0430\u0440\u043e\u043b\u0438 \u0412\u043e\u0432\u0430\u043d\u0443 \u0438 \u0414\u0438\u043c\u043e\u043d. \u0422\u0435, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0438\u0445 \u043f\u0440\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0441 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043e\u043a.<\/p>\n<p>\u00a0<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>1.\u00a0\u00a0\u00a0\u00a0 \u00a0\u041c\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u0443(username);<\/p>\n<p>2.\u00a0\u00a0\u00a0\u00a0 \u00a0\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u0438. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>3.\u00a0\u00a0\u00a0\u00a0 \u00a0\u0421\u0435\u0440\u0432\u0438\u0441\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e<\/p>\n<p>\u00a0<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u0438. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u043b\u0438\u0447\u043d\u043e\u0441\u0442\u044c(prove user\u2019s identity), \u043d\u0430 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0435 \u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/976\/2ad\/208\/9762ad20878ffbc00036ec95b009cdcb.jpeg\" alt=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441  \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\" title=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441  \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/976\/2ad\/208\/9762ad20878ffbc00036ec95b009cdcb.jpeg\" data-blurred=\"true\"\/><figcaption>\u041f\u0440\u043e\u0446\u0435\u0441\u0441  \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/figcaption><\/figure>\n<pre><code class=\"python\"># main.py from typing import Optional  from flask import request, jsonify, make_response  import services as notes_service from app import app from models import User from utils import hash_password   def authenticate_user(user: Optional[User], password: str) -> bool:     if user is None:         return False      return user.password == hash_password(password)   def identify_user(credentials: Optional[dict]) -> Optional[User]:     if credentials is None:         return None      username = credentials.get('username')     user = User.query.filter_by(username=username).first()      return user   @app.route(\"\/notes\", methods=['POST']) def create_note_api():     credentials = request.json().get('credentials')     user = identify_user(credentials=credentials)      password = credentials.get('password')     if not authenticate_user(user=user, password=password):         # Can't authenticate user, permission denied         response = make_response(             jsonify(                 {                     'msg': \"Not authenticated\"                 }             ), 403         )         response.headers[\"Content-Type\"] = \"application\/json\"         return response      note = notes_service.create_note(request=request, user=user)     response = make_response(         jsonify(             {                 'title': note.title,                 'body': note.body,             }         ), 201     )     response.headers[\"Content-Type\"] = \"application\/json\"     return response <\/code><\/pre>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438:<\/p>\n<blockquote>\n<p><strong>\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0301\u0446\u0438\u044f<\/strong> (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA\" rel=\"noopener noreferrer nofollow\">\u0430\u043d\u0433\u043b.<\/a>\u00a0<em>authentication<\/em> &lt; <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%93%D1%80%D0%B5%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA\" rel=\"noopener noreferrer nofollow\">\u0433\u0440\u0435\u0447.<\/a> <a href=\"https:\/\/ru.wiktionary.org\/wiki\/%CE%B1%E1%BD%90%CE%B8%CE%B5%CE%BD%CF%84%CE%B9%CE%BA%CF%8C%CF%82\" rel=\"noopener noreferrer nofollow\">\u03b1\u1f50\u03b8\u03b5\u03bd\u03c4\u03b9\u03ba\u03cc\u03c2<\/a> [authentikos] \u00ab\u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439, \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u044b\u0439\u00bb &lt; \u03b1\u1f50\u03c4\u03cc\u03c2 [autos] \u00ab\u0441\u0430\u043c; \u043e\u043d \u0441\u0430\u043c\u044b\u0439\u00bb)\u00a0\u2014 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e\u0441\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <\/p>\n<p>&#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e\u0441\u0442\u0438      \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0443\u0442\u0451\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u0438\u043c \u043f\u0430\u0440\u043e\u043b\u044f (\u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A3%D1%87%D1%91%D1%82%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C\" rel=\"noopener noreferrer nofollow\">\u043b\u043e\u0433\u0438\u043d\u0430<\/a>) \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c, \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u043c \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%91%D0%B0%D0%B7%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85\" rel=\"noopener noreferrer nofollow\">\u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/a> \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043b\u043e\u0433\u0438\u043d\u043e\u0432;<\/p>\n<p>&#8212; \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e\u0441\u0442\u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D1%87%D1%82%D0%B0\" rel=\"noopener noreferrer nofollow\">\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0438\u0441\u044c\u043c\u0430<\/a> \u043f\u0443\u0442\u0451\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A6%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BF%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8C\" rel=\"noopener noreferrer nofollow\">\u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438<\/a> \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D1%8B%D0%BC_%D0%BA%D0%BB%D1%8E%D1%87%D0%BE%D0%BC\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f<\/a>;<\/p>\n<p>&#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%83%D0%BC%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b<\/a> <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A4%D0%B0%D0%B9%D0%BB\" rel=\"noopener noreferrer nofollow\">\u0444\u0430\u0439\u043b\u0430<\/a>      \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0443\u043c\u043c\u0435, \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.<\/p>\n<\/blockquote>\n<p>\u00a0 \u0420\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u044f:<\/p>\n<p>\u00b7\u00a0\u00a0\u00a0\u00a0\u00a0 \u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043b\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f;<\/p>\n<p>\u00b7\u00a0\u00a0\u00a0\u00a0\u00a0 \u041c\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430\/\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u2013 \u0435\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f. \u041e\u0434\u043d\u043e\u0444\u0430\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f;<\/p>\n<p>\u00b7\u00a0\u00a0\u00a0\u00a0\u00a0 \u041f\u0435\u0440\u0435\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044e\u0437\u0435\u0440\u0430;<\/p>\n<p>\u00b7\u00a0\u00a0\u00a0\u00a0\u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u2013 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0438\u043a\u043d\u0435\u0439\u043c\u0430\/\u0438\u043c\u0435\u0439\u043b\u0430 \u0438 \u0441\u0432\u0435\u0440\u043a\u0430 \u043f\u0430\u0440\u043e\u043b\u044f(\u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0442\u043e\u0442, \u043a\u0435\u043c \u0441\u0435\u0431\u044f \u0432\u044b\u0434\u0430\u0435\u0442). <\/p>\n<p>\u00b7\u00a0\u00a0\u00a0\u00a0\u00a0 \u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 \u043b\u043e\u0433\u0438\u043d\u0430, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0443.<\/p>\n<h2>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445? \u0418\u043b\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0430\u0440\u043e\u043b\u044c \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0411\u0414? <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/baf\/9df\/c37\/baf9dfc371e3529d69fe873df5c3b0a1.jpeg\" alt=\"\u041e\u0442\u043a\u0430\u0437 \u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f\" title=\"\u041e\u0442\u043a\u0430\u0437 \u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/baf\/9df\/c37\/baf9dfc371e3529d69fe873df5c3b0a1.jpeg\" data-blurred=\"true\"\/><figcaption>\u041e\u0442\u043a\u0430\u0437 \u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f<\/figcaption><\/figure>\n<p>\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/8a4\/a81\/6a3\/8a4a816a30ca7e4d19ee87ddef0bf0b3.jpeg\" alt=\"\u041e\u0442\u043a\u0430\u0437 \u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437-\u0437\u0430  \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438  \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\" title=\"\u041e\u0442\u043a\u0430\u0437 \u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437-\u0437\u0430  \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438  \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8a4\/a81\/6a3\/8a4a816a30ca7e4d19ee87ddef0bf0b3.jpeg\" data-blurred=\"true\"\/><figcaption>\u041e\u0442\u043a\u0430\u0437 \u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437-\u0437\u0430  \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438  \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/figcaption><\/figure>\n<p>\u0412\u044b \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438, \u0447\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u044b, \u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d \u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. <\/p>\n<p>\u041a\u0430\u043a\u043e\u0439 HTTP \u043a\u043e\u0434 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435? \u041f\u043e\u0440\u044b\u0441\u043a\u0430\u0432 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0441\u043f\u0438\u0441\u043e\u043a HTTP \u043a\u043e\u0434\u043e\u0432, \u0432\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u0439 \u0437\u0430 \u0441\u0435\u0431\u044f \u043e\u0442\u0432\u0435\u0442 401 Unauthroized. \u0422\u043e \u0435\u0441\u0442\u044c \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/002\/1be\/731\/0021be7318e81e9c0d8286d42b77ada9.jpeg\" alt=\"401 Unathorized\" title=\"401 Unathorized\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/002\/1be\/731\/0021be7318e81e9c0d8286d42b77ada9.jpeg\" data-blurred=\"true\"\/><figcaption>401 Unathorized<\/figcaption><\/figure>\n<pre><code class=\"python\">from typing import Optional  from flask import request, jsonify, make_response  import services as notes_service from app import app from models import User from utils import hash_password   def authenticate_user(user: Optional[User], password: str) -> bool:     if user is None:         return False      return user.password == hash_password(password)   def identify_user(credentials: Optional[dict]) -> Optional[User]:     if credentials is None:         return None      username = credentials.get('username')     user = User.query.filter_by(username=username).first()      return user   def is_authorized(user: Optional[User]) -> bool:     data = request.get_json()     credentials = data.get('credentials')     password = credentials.get('password')      if not authenticate_user(user=user, password=password):         # Can't authenticate user, permission denied         return False      return True   @app.route(\"\/notes\", methods=['POST']) def create_note():     data = request.get_json()     credentials = data.get('credentials')     user = identify_user(credentials=credentials)      if not is_authorized(user=user):         response = make_response(             jsonify(                 {                     'msg': 'Credentials not valid',                 }             ), 401         )         response.headers[\"Content-Type\"] = \"application\/json\"         return response       note = notes_service.create_note(request=request, user=user)      response = make_response(         jsonify(             {                 'title': note.title,                 'body': note.body,             }         ), 201     )     response.headers[\"Content-Type\"] = \"application\/json\"     return response <\/code><\/pre>\n<p>\u0412\u044b \u0432\u0441\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0432\u043d\u043e\u0432\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u0441\u0435\u0440\u0432\u0438\u0441. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0432\u0430\u0441 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u0432\u043e\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 json. \u0412\u043e\u0432\u0430\u043d \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 HTTP \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/186\/df0\/d6a\/186df0d6aca8b9cfbed4336a5602bc6b.png\" width=\"934\" height=\"822\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/186\/df0\/d6a\/186df0d6aca8b9cfbed4336a5602bc6b.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u0430\u043a\u043e\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d? \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435, \u0442\u043e \u043c\u044b \u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0443\u0435\u043c \u044e\u0437\u0435\u0440\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430 401 Unathorized. \u041f\u0443\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0432\u0435\u0434\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u201cAuthorization\u201d. \u041c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438, \u0442\u043e \u043c\u044b \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0443\u0435\u043c. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u201cAuthorization\u201d \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043a\u0430\u043a \u0431\u044b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 &#171;\u044f \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0446\u0438\u0435\u0439\u201d. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b55\/a7a\/a32\/b55a7aa3295e0dfec2fc0477ec59f945.png\" width=\"934\" height=\"594\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b55\/a7a\/a32\/b55a7aa3295e0dfec2fc0477ec59f945.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443:<\/p>\n<p>1.\u00a0\u00a0\u00a0\u00a0 \u00a0\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u043d\u043e \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043b\u0438\u0431\u043e \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/p>\n<p>2.\u00a0\u00a0\u00a0\u00a0 \u041d\u0430\u0448 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0435\u0442, \u043b\u0438\u0431\u043e \u043e\u043d\u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u201c\u0442\u044b \u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u201d. <\/p>\n<p>3.\u00a0\u00a0\u00a0\u00a0 HTTP \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u043e\u0441\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<p>4.\u00a0\u00a0\u00a0\u00a0 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c Autthorization, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/p>\n<p>5.\u00a0\u00a0\u00a0\u00a0 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/7f6\/5f5\/695\/7f65f5695f048e2d84006b77c79a5689.jpeg\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f6\/5f5\/695\/7f65f5695f048e2d84006b77c79a5689.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<pre><code class=\"python\">from typing import Optional  from flask import request, jsonify, make_response  import services as notes_service from app import app from models import User from utils import hash_password   def authenticate_user(user: Optional[User], password: str) -> bool:     if user is None:         return False      return user.password == hash_password(password)   def identify_user() -> Optional[User]:     credentials = request.headers.get('Authorization')     if not credentials:         return None      username, _ = credentials.split(':')      user = User.query.filter_by(username=username).first()      return user   def is_authorized(user: Optional[User]) -> bool:     credentials = request.headers.get('Authorization')     username, password = credentials.split(':')      if not authenticate_user(user=user, password=password):         # Can't authenticate user, permission denied         return False      return True   @app.route(\"\/notes\", methods=['POST']) def create_note():     user = identify_user()      if not is_authorized(user=user):         response = make_response(             jsonify(                 {                     'msg': 'Credentials not valid',                 }             ), 401         )         response.headers[\"Content-Type\"] = \"application\/json\"         return response      note = notes_service.create_note(request=request, user=user)      response = make_response(         jsonify(             {                 'title': note.title,                 'body': note.body,             }         ), 201     )     response.headers[\"Content-Type\"] = \"application\/json\"     return response <\/code><\/pre>\n<h2>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/h2>\n<p>\u0414\u0438\u043c\u043e\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0443\u043c\u0430\u043b \u043d\u0430\u043f\u0435\u0440\u0435\u0434 \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0422\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439(basic). \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438(\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u0434), \u043c\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u043c \u0435\u043c\u0443, \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e, \u0430 \u043d\u0435 \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u0434. <\/p>\n<p>&#8212; \u0435\u0449\u0435 \u044f \u043d\u0435 \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u0432\u0438\u0434\u0435 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0445 \u0438\u043b\u0438 \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438, \u044d\u0442\u043e \u0431\u043e\u043b\u044c. \u041f\u0443\u0441\u0442\u044c \u043b\u0443\u0447\u0448\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e base64. \u042d\u0442\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0432 ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0431\u0435\u0437 \u0432\u043e\u0437\u043d\u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438. \u0422\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>&#8212; \u0412\u044b \u0435\u0449\u0435 \u0437\u0430\u0431\u044b\u043b\u0438, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u0441\u0435\u0440\u0432\u0438\u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0445\u043e\u0441\u0442, \u0442\u043e \u0438\u0445 \u0441\u0442\u043e\u0438\u043b\u043e \u0431\u044b \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u043b\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u044d\u0442\u043e realm. <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0432\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0445\u0435\u043c\u0435, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438:<\/p>\n<p>1.\u00a0\u00a0\u00a0\u00a0 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u043d\u043e \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043b\u0438\u0431\u043e \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/p>\n<p>2.\u00a0\u00a0\u00a0\u00a0 \u041d\u0430\u0448 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0435\u0442, \u043b\u0438\u0431\u043e \u043e\u043d\u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u201c\u0442\u044b \u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\u201d. \u0412 \u0434\u043e\u0431\u0430\u0432\u043e\u043a \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a WWW-Authenticate \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u0443\u0436\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f(realm) API \u0437\u0430\u043c\u0435\u0442\u043e\u043a. <\/p>\n<p>3.\u00a0\u00a0\u00a0\u00a0 HTTP \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0441\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0432\u0435\u0441\u0442\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0438 \u043f\u0430\u0440\u043e\u043b\u044c. \u0421\u043c\u043e\u0442\u0440\u0438\u0442, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 notes_api. <\/p>\n<p>4.\u00a0\u00a0\u00a0\u00a0 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 base64 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c Authorization, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/p>\n<p>5.\u00a0\u00a0\u00a0\u00a0 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/b33\/758\/88c\/b3375888cf4d4c97a7f6aa03b6c7ee23.jpeg\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b33\/758\/88c\/b3375888cf4d4c97a7f6aa03b6c7ee23.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<pre><code class=\"python\"># main.py from typing import Optional  from flask import request, jsonify, make_response import base64  import services as notes_service from app import app from models import User from utils import hash_password   def authenticate_user(user: Optional[User], password: str) -> bool:     if user is None:         return False      return user.password == hash_password(password)   def identify_user() -> Optional[User]:     scheme, credentials = request.headers.get('Authorization').split()     if not credentials:         return None      decoded_credentials = base64.b64decode(credentials).decode()     username, _ = decoded_credentials.split(':')      user = User.query.filter_by(username=username).first()      return user   def is_authorized(user: Optional[User]) -> bool:     scheme, credentials = request.headers.get('Authorization').split()     decoded_credentials = base64.b64decode(credentials).decode()     username, password = decoded_credentials.split(':')      if not authenticate_user(user=user, password=password):         # Can't authenticate user, permission denied         return False      return True   @app.route(\"\/notes\", methods=['POST']) def create_note():     user = identify_user()      if not is_authorized(user=user):         response = make_response(             jsonify(                 {                     'msg': 'Credentials not valid',                 }             ), 401         )         response.headers[\"Content-Type\"] = \"application\/json\"         response.headers[\"WWW-Authenticate\"] = \"Basic realm=notes_api\"          return response      note = notes_service.create_note(request=request, user=user)      response = make_response(         jsonify(             {                 'title': note.title,                 'body': note.body,             }         ), 201     )     response.headers[\"Content-Type\"] = \"application\/json\"     return response <\/code><\/pre>\n<h2>Middleware<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432 \u043c\u0435\u0441\u0442\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u044e\u0437\u0435\u0440\u0430 \u0434\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442. \u041e\u0431\u044b\u0447\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 Middleware.\u00a0 \u042d\u0442\u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0440\u044f\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438 \u0442.\u0434 \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 authentication middleware \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0432\u0441\u044e\u0434\u0443 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f. \u0412\u043e Flask \u0436\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 middleware \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u0430\u044f  \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b. \u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442  \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u0434 \u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0430\u043c\u0438\u043c \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u043c. \u042d\u0442\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 middleware<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/3c5\/ca9\/bae\/3c5ca9bae4b750bfc9a828636d91a135.jpeg\" alt=\"\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f Middleware\" title=\"\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f Middleware\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3c5\/ca9\/bae\/3c5ca9bae4b750bfc9a828636d91a135.jpeg\" data-blurred=\"true\"\/><figcaption>\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f Middleware<\/figcaption><\/figure>\n<pre><code class=\"python\"># main.py import base64 from functools import wraps from typing import Optional  from flask import request, jsonify, make_response  import services as notes_service from app import app from models import User from utils import hash_password   def authenticate_user(user: Optional[User], password: str) -> bool:     if user is None:         return False      return user.password == hash_password(password)   def identify_user() -> Optional[User]:     scheme, credentials = request.headers.get('Authorization').split()     if not credentials:         return None      decoded_credentials = base64.b64decode(credentials).decode()     username, _ = decoded_credentials.split(':')      user = User.query.filter_by(username=username).first()      return user   def is_authorized(user: Optional[User]) -> bool:     scheme, credentials = request.headers.get('Authorization').split()     decoded_credentials = base64.b64decode(credentials).decode()     username, password = decoded_credentials.split(':')      if not authenticate_user(user=user, password=password):         # Can't authenticate user, permission denied         return False      return True   def authenticate(f):     @wraps(f)     def wrapper(*args, **kwargs):         user = identify_user()          if not is_authorized(user=user):             response = make_response(                 jsonify(                     {                         'msg': 'Credentials not valid',                     }                 ), 401             )             response.headers[\"Content-Type\"] = \"application\/json\"             response.headers[\"WWW-Authenticate\"] = \"Basic realm=notes_api\"              return response          request.user = user          return f(*args, **kwargs)     return wrapper   @app.route(\"\/notes\", methods=['POST']) @authenticate def create_note():     note = notes_service.create_note(request=request, user=request.user)      response = make_response(         jsonify(             {                 'title': note.title,                 'body': note.body,             }         ), 201     )     response.headers[\"Content-Type\"] = \"application\/json\"     return response <\/code><\/pre>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b \u0438 \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u0432\u0441\u0435<\/h2>\n<p>\u0427\u0442\u043e \u043c\u044b \u0443\u0437\u043d\u0430\u043b\u0438 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438:<\/p>\n<ul>\n<li>\n<p>\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u043f\u0443\u0442\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441 \u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0442\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0432\u0435\u043b\u0438 \u043d\u043e\u0432\u0443\u044e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u044e\u0437\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 username.  \u041e\u043d \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044e\u0437\u0435\u0440\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0434 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0432 \u0411\u0414 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c username\/email.  <\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ec8\/f8f\/acd\/ec8f8facd7e27464475a961bfea79613.gif\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ec8\/f8f\/acd\/ec8f8facd7e27464475a961bfea79613.gif\"\/><figcaption><\/figcaption><\/figure>\n<ul>\n<li>\n<p>\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c,  \u0447\u0442\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u043e\u0442, \u043a\u0435\u043c \u0441\u0435\u0431\u044f \u0432\u044b\u0434\u0430\u0435\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0441\u043b\u0443\u0436\u0438\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f  \u0438 \u0441\u0432\u0435\u0440\u043a\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0421\u0445\u0435\u043c\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u044d\u0442\u043e \u043e\u0434\u043d\u043e\u0444\u0430\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u0442\u0430\u043a-\u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0434\u0438\u043d \u0444\u0430\u043a\u0442\u043e\u0440 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 &#8212; \u043f\u0430\u0440\u043e\u043b\u044c.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b53\/479\/db0\/b53479db005f1297167e405df2ebff1d.gif\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b53\/479\/db0\/b53479db005f1297167e405df2ebff1d.gif\"\/><figcaption><\/figcaption><\/figure>\n<ul>\n<li>\n<p>\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u041e\u0431\u044b\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432 HTTP \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0443 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u044e\u0437\u0435\u0440\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aab\/bbb\/894\/aabbbb894fc35011488fe53b20536349.gif\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aab\/bbb\/894\/aabbbb894fc35011488fe53b20536349.gif\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2c4\/4ba\/3f9\/2c44ba3f9a9d89949bb8e63257f3b02b.gif\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2c4\/4ba\/3f9\/2c44ba3f9a9d89949bb8e63257f3b02b.gif\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c? \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445, \u043a\u0430\u043a  django, django-rest-framework, flask, fastAPI \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b, \u0445\u043e\u0442\u044f \u0434\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 &#8212; \u0433\u0434\u0435-\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439  \u043a\u043b\u0430\u0441\u0441, \u0433\u0434\u0435-\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0442.\u0434.<\/p>\n<details class=\"spoiler\">\n<summary> \u041a\u0443\u0441\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043a\u043e\u0434\u0430 django-rest-framework:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">class BasicAuthentication(BaseAuthentication):     \"\"\"     HTTP Basic authentication against username\/password.     \"\"\"     www_authenticate_realm = 'api'      def authenticate(self, request):         \"\"\"         Returns a `User` if a correct username and password have been supplied         using HTTP Basic authentication.  Otherwise returns `None`.         \"\"\"         auth = get_authorization_header(request).split()          if not auth or auth[0].lower() != b'basic':             return None          if len(auth) == 1:             msg = _('Invalid basic header. No credentials provided.')             raise exceptions.AuthenticationFailed(msg)         elif len(auth) > 2:             msg = _('Invalid basic header. Credentials string should not contain spaces.')             raise exceptions.AuthenticationFailed(msg)          try:             try:                 auth_decoded = base64.b64decode(auth[1]).decode('utf-8')             except UnicodeDecodeError:                 auth_decoded = base64.b64decode(auth[1]).decode('latin-1')             auth_parts = auth_decoded.partition(':')         except (TypeError, UnicodeDecodeError, binascii.Error):             msg = _('Invalid basic header. Credentials not correctly base64 encoded.')             raise exceptions.AuthenticationFailed(msg)          userid, password = auth_parts[0], auth_parts[2]         return self.authenticate_credentials(userid, password, request)      def authenticate_credentials(self, userid, password, request=None):         \"\"\"         Authenticate the userid and password against username and password         with optional request for context.         \"\"\"         credentials = {             get_user_model().USERNAME_FIELD: userid,             'password': password         }         user = authenticate(request=request, **credentials)          if user is None:             raise exceptions.AuthenticationFailed(_('Invalid username\/password.'))          if not user.is_active:             raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))          return (user, None)      def authenticate_header(self, request):         return 'Basic realm=\"%s\"' % self.www_authenticate_realm<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430 FastAPI<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">class HTTPBasic(HTTPBase):     def __init__(         self,         *,         scheme_name: Optional[str] = None,         realm: Optional[str] = None,         description: Optional[str] = None,         auto_error: bool = True,     ):         self.model = HTTPBaseModel(scheme=\"basic\", description=description)         self.scheme_name = scheme_name or self.__class__.__name__         self.realm = realm         self.auto_error = auto_error      async def __call__(  # type: ignore         self, request: Request     ) -> Optional[HTTPBasicCredentials]:         authorization: str = request.headers.get(\"Authorization\")         scheme, param = get_authorization_scheme_param(authorization)         if self.realm:             unauthorized_headers = {\"WWW-Authenticate\": f'Basic realm=\"{self.realm}\"'}         else:             unauthorized_headers = {\"WWW-Authenticate\": \"Basic\"}         invalid_user_credentials_exc = HTTPException(             status_code=HTTP_401_UNAUTHORIZED,             detail=\"Invalid authentication credentials\",             headers=unauthorized_headers,         )         if not authorization or scheme.lower() != \"basic\":             if self.auto_error:                 raise HTTPException(                     status_code=HTTP_401_UNAUTHORIZED,                     detail=\"Not authenticated\",                     headers=unauthorized_headers,                 )             else:                 return None         try:             data = b64decode(param).decode(\"ascii\")         except (ValueError, UnicodeDecodeError, binascii.Error):             raise invalid_user_credentials_exc         username, separator, password = data.partition(\":\")         if not separator:             raise invalid_user_credentials_exc         return HTTPBasicCredentials(username=username, password=password)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430 flask_httpauth<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">class HTTPBasicAuth(HTTPAuth):     def __init__(self, scheme=None, realm=None):         super(HTTPBasicAuth, self).__init__(scheme or 'Basic', realm)          self.hash_password_callback = None         self.verify_password_callback = None      def hash_password(self, f):         self.hash_password_callback = f         return f      def verify_password(self, f):         self.verify_password_callback = f         return f      def get_auth(self):         # this version of the Authorization header parser is more flexible         # than Werkzeug's, as it also accepts other schemes besides \"Basic\"         header = self.header or 'Authorization'         if header not in request.headers:             return None         value = request.headers[header].encode('utf-8')         try:             scheme, credentials = value.split(b' ', 1)             username, password = b64decode(credentials).split(b':', 1)         except (ValueError, TypeError):             return None         try:             username = username.decode('utf-8')             password = password.decode('utf-8')         except UnicodeDecodeError:             username = None             password = None         return Authorization(             scheme, {'username': username, 'password': password})      def authenticate(self, auth, stored_password):         if auth:             username = auth.username             client_password = auth.password         else:             username = \"\"             client_password = \"\"         if self.verify_password_callback:             return self.ensure_sync(self.verify_password_callback)(                 username, client_password)         if not auth:             return         if self.hash_password_callback:             try:                 client_password = self.ensure_sync(                     self.hash_password_callback)(client_password)             except TypeError:                 client_password = self.ensure_sync(                     self.hash_password_callback)(username, client_password)         return auth.username if client_password is not None and \\             stored_password is not None and \\             hmac.compare_digest(client_password, stored_password) else None<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u00a0\u0412 \u043a\u0443\u0441\u043a\u0430\u0445 \u043a\u043e\u0434\u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u043d\u043e \u0435\u0441\u0442\u044c \u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0440\u0430\u0435\u043c  \u0433\u043b\u0430\u0437\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0446\u0435\u043f\u0438\u0442\u044c\u0441\u044f \u0437\u0430 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 <code>authenticate<\/code> , \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a<code>Authorization<\/code> , \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>WWW-Authenticate<\/code> , <code>scheme<\/code>, <code>credentials<\/code>\u00a0, <code>HTTP_401_UNAUTHORIZED<\/code> <br \/>\u0425\u043e\u0442\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u044e\u0437\u0435\u0440\u0430 \u0442\u0443\u0442 \u044f\u0432\u043d\u043e \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442,  \u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. <\/p>\n<p>\u0418\u0442\u043e\u0433\u043e &#8212; \u0432\u044b  \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043e \u0447\u0435\u043c \u0440\u0435\u0447\u044c. \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0438  \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f JWT \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>Authorization<\/code> , \u043f\u0430\u0440\u0441\u0438\u0442\u044c <code>scheme<\/code> (Bearer)  \u0438 <code>credentials<\/code> (\u0441\u0430\u043c \u0442\u043e\u043a\u0435\u043d), \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044e\u0437\u0435\u0440\u0430(\u043f\u043e \u0430\u0439\u0434\u0438 \u0432 \u0442\u043e\u043a\u0435\u043d\u0435) \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c(\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u0430 \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u044e\u0437\u0435\u0440\u0430). \u0418 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u0440\u044f\u0447\u0443\u0442 \u044d\u0442\u043e \u0432\u0441\u0435 \u0433\u0434\u0435-\u0442\u043e \u0432 \u0447\u0430\u0441\u0442\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441 middleware. <\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/682170\/\"> https:\/\/habr.com\/ru\/post\/682170\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u042f \u0447\u0430\u0441\u0442\u043e \u043f\u0443\u0442\u0430\u044e \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b \u0431\u044b \u044d\u0442\u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442.<\/p>\n<p>\u0422\u0435\u0440\u043c\u0438\u043d\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0441\u043f\u043b\u044b\u0432\u0447\u0430\u0442\u044b, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u044d\u043a\u0435\u043d\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u042f \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043b \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445. \u0412 \u0434\u043e\u0431\u0430\u0432\u043e\u043a \u044d\u0442\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u041f\u0440\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0441 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0447\u0430\u0441\u0442\u043e.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0434 \u0431\u044d\u043a\u0435\u043d\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 API \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 HTTP. \u041c\u043d\u0435, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443, \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 REST API \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u0432\u0435\u0431 \u0441\u0442\u0440\u0430\u043d\u0438\u0446. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0435\u0440\u0435\u043c Flask \u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0438\u0448\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 \u0441 API \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430. \u0418\u043b\u0438 \u0431\u0435\u0440\u0435\u043c django \u0438 django-rest-framework \u0438 \u043f\u0438\u0448\u0435\u043c REST API \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0430. \u0412\u043e \u0432\u0441\u0435\u0445 \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c, \u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0435\u0439. \u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 JWT, Oauth. \u0418 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0432\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u043a \u0433\u0443\u0433\u043b\u0435\u043d\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432.<\/p>\n<p>\u00a0\u042f \u0436\u0435 \u0445\u043e\u0447\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u044d\u0442\u0430\u043f\u043d\u043e \u0440\u0430\u0441\u043a\u0440\u043e\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0437\u043d\u0430\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u0447\u0435 \u0440\u0435\u0448\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u044d\u0442\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0438. \u042f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043b\u043e\u0431 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u044d\u0442\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u044b. \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u0442\u0438\u043b\u0435, \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u0432\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435\u0441\u044c \u0443 \u0438\u0441\u0442\u043e\u043a\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u0432\u043e\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434.<\/p>\n<h2>\u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043e\u043a<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441 API \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u0442\u043e\u043a. \u041d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u0430\u043f \u043a\u0440\u0435\u043c\u043d\u0438\u0435\u0432\u043e\u0439 \u0434\u043e\u043b\u0438\u043d\u044b. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 Flask, \u0411\u0414 \u2013 sqlite, \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0411\u0414 \u0447\u0435\u0440\u0435\u0437 ORM \u2013 SQLAlchemy.\u00a0 <\/p>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u043c. \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u2013 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a(varchar 256) \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435(text).<\/p>\n<figure class=\"full-width\"><figcaption>\u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/figcaption><\/figure>\n<pre><code class=\"python\"># models.py class Note(db.Model):     id = db.Column(db.Integer, primary_key=True)     title = db.Column(db.String(256))     body = db.Column(db.Text)      def __repr__(self):         return '&lt;Note %r>' % self.title<\/code><\/pre>\n<p>\u0412\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e create_note \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 HTTP \u043e\u0442\u0432\u0435\u0442 \u0441 \u043a\u043e\u0434\u043e\u043c 201 CREATED \u0438 json, \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0435. \u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0442\u0443\u0441? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u00a0 REST API.\u00a0 <\/p>\n<p>\u042d\u0442\u043e\u0442 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043b\u044e\u0431\u043e\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u043e\u0439, \u0443 \u043a\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442 \u00a0\u0432\u0430\u0448 \u0434\u0440\u0443\u0433 \u0412\u043e\u0432\u0430\u043d.\u00a0 \u0412\u043e\u0432\u0430\u043d \u0441\u0430\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 HTTP \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0448\u043b\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0417\u0430\u043c\u0435\u0442\u043a\u0430 \u0412\u043e\u0432\u0430\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/p>\n<figure class=\"full-width\"><figcaption>\u041f\u0440\u043e\u0446\u0435\u0441\u0441  \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f  \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/figcaption><\/figure>\n<pre><code class=\"python\"># main.py from flask import request, jsonify  import services as notes_service from app import app   @app.route(\"\/notes\", methods=['POST']) def create_note():     note = notes_service.create_note(request=request)     response = make_response(         jsonify(             {                 'title': note.title,                 'body': note.body,             }         ), 201     )     response.headers[\"Content-Type\"] = \"application\/json\"     return response <\/code><\/pre>\n<p>\u0412\u043e\u0432\u0430\u043d \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0437\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0430 \u2013 \u0414\u0438\u043c\u043e\u043d\u0430. \u0414\u0438\u043c\u043e\u043d \u0441\u0430\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 HTTP \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0442\u043e\u0436\u0435 \u0448\u043b\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0417\u0430\u0442\u0435\u043c \u0432\u044b \u0432\u043c\u0435\u0441\u0442\u0435 \u043b\u044e\u0431\u0443\u0435\u0442\u0435\u0441\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c\u0438 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432\u044b \u0441 \u0412\u043e\u0432\u0430\u043d\u043e\u043c \u0438 \u0414\u0438\u043c\u0430\u043d\u043e\u043c \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e<br \/> \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u0430\u043f. \u0412\u043e\u0432\u0430\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043a\u043b\u0430\u0434\u0443\u0442\u0441\u044f \u0432<br \/> \u043e\u0431\u0449\u0443\u044e \u043a\u0443\u0447\u0443 \u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0442\u043e \u043a\u0430\u043a\u0443\u044e \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043b. \u041d\u043e\u0432\u044b\u0435 \u044e\u0437\u0435\u0440\u044b \u0442\u043e\u0447\u043d\u043e<br \/> \u0442\u0430\u043a \u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u043b\u0430\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0432 \u043e\u0431\u0449\u0443\u044e \u043a\u0443\u0447\u0443. \u0420\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0442\u043e \u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u0431\u0443\u0434\u0435\u0442<br \/> \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e. <\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0430\u0437\u043d\u044b\u0435 \u043b\u044e\u0434\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442  \u0441\u0435\u0440\u0432\u0438\u0441<\/figcaption><\/figure>\n<h2>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0412\u044b \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435:<br \/> &#8212; \u041a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0437\u0430\u043c\u0435\u0442\u043a\u0443?<\/p>\n<p>&#8212; \u041d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0443.<\/p>\n<p>&#8212; \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e \u0438\u043c\u0435\u043d\u0438? <\/p>\n<p>&#8212; \u0427\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u043e\u0433\u043e, \u043d\u043e \u0438\u043c\u044f \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c<\/p>\n<p>&#8212; \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c. \u041f\u0443\u0441\u0442\u044c \u0414\u0438\u043c\u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d dimon.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0442\u043e \u0432 \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u043b\u044e\u0434\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u043e\u0439. \u042d\u0442\u0438 \u043b\u044e\u0434\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u0435  \u0434\u0435\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443\/\u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041d\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c, \u043f\u0440\u0438\u0447\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c.<\/p>\n<figure class=\"full-width\"><figcaption>\u041d\u043e\u0432\u0430\u044f  \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c. \u041d\u0430\u0432\u0435\u0448\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c<\/figcaption><\/figure>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, username \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<pre><code class=\"python\">from db import db   class User(db.Model):     id = db.Column(db.Integer, primary_key=True)     username = db.Column(db.String(120), unique=True, nullable=False)      def __repr__(self):         return '&lt;User %r>' % self.username   class Note(db.Model):     id = db.Column(db.Integer, primary_key=True)     title = db.Column(db.String(256))     body = db.Column(db.Text)      def __repr__(self):         return '&lt;Note %r>' % self.title <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 \u043f\u0430\u0440\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0437\u0430\u043d\u043e\u0441\u0438\u0442\u0435 \u0442\u0443\u0434\u0430 2 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u2013 dimon_01 \u0438 vovan.\u00a0 \u041d\u0430\u0448\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u043d\u0430\u0435\u0442 \u043e\u0431 \u044d\u0442\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u0445.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0430\u0432\u0442\u043e\u0440\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0438. \u0422\u0430\u043a\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c &#8212;\u00a0 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u0435\u0442\u043e\u043a.<\/p>\n<figure class=\"full-width\"><figcaption>\u041d\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0441\u0432\u044f\u0437\u0438<\/figcaption><\/figure>\n<pre><code class=\"python\"># models.py from db import db   class User(db.Model):     id = db.Column(db.Integer, primary_key=True)     username = db.Column(db.String(120), unique=True, nullable=False)      def __repr__(self):         return '&lt;User %r>' % self.username   class Note(db.Model):     id = db.Column(db.Integer, primary_key=True)     title = db.Column(db.String(256))     body = db.Column(db.Text)     user_id = db.Column(         db.Integer, db.ForeignKey('user.id'),         nullable=False     )     user = db.relationship(         'User',         backref=db.backref('notes', lazy=True)     )      def __repr__(self):         return '&lt;Note %r>' % self.title <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0411\u0414, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043a\u0430\u043a-\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435(username) \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 json \u043f\u043e\u043c\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0435(\u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442\u0435\u043b\u043e) \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u043e\u043b\u0435 credentials. \u0412 \u043a\u043e\u0434\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0438\u0449\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0411\u0414 \u043f\u043e \u0435\u0433\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u0443. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0434\u0435\u043d \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u044e\u0437\u0435\u0440\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e create_note, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u0430. <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0435\u0433\u043e \u0432 \u0411\u0414, \u044d\u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. <\/p>\n<figure class=\"full-width\"><figcaption>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0412\u043e\u0432\u0430\u043d\u0430<\/figcaption><\/figure>\n<pre><code class=\"python\"># main.py from typing import Optional  from flask import request, jsonify  import services as notes_service from app import app from models import User   def identify_user(credentials: Optional[dict]) -> Optional[User]:     if credentials is None:         return None      username = credentials.get('username')     user = User.query.filter_by(username=username).first()      return user   @app.route(\"\/notes\", methods=['POST']) def create_note_api():     credentials = request.json().get('credentials')     user = identify_user(credentials=credentials)      note = notes_service.create_note(request=request, user=user)     response = make_response(         jsonify(             {                 'title': note.title,                 'body': note.body,             }         ), 201     )     response.headers[\"Content-Type\"] = \"application\/json\"     return response <\/code><\/pre>\n<pre><code class=\"python\"># services.py from flask import Request  from db import db from models import Note, User   def create_note(request: Request, user: User) -> Note:     note = Note(         title=request.json['title'],         body=request.json['body'],         user=user,     )     db.session.add(note)     db.session.commit()      return note <\/code><\/pre>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438 \u0438 \u0432\u0438\u043a\u0438\u0441\u043b\u043e\u0432\u0430\u0440\u044f<\/p>\n<p>\u0412\u0438\u043a\u0438\u0441\u043b\u043e\u0432\u0430\u0440\u044c:<\/p>\n<blockquote>\n<p><a href=\"https:\/\/ru.wiktionary.org\/wiki\/%D0%92%D0%B8%D0%BA%D0%B8%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D1%80%D1%8C:%D0%A3%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D1%81%D0%BE%D0%BA%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\"><em>\u043a\u043e\u043c\u043f.<\/em><\/a> \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445) \u043f\u0443\u0442\u0451\u043c <a href=\"https:\/\/ru.wiktionary.org\/wiki\/%D0%BF%D1%80%D0%B8%D1%81%D0%B2%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f<\/a> \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043b\u0438\u0431\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441 \u043f\u0435\u0440\u0435\u0447\u043d\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432<\/p>\n<\/blockquote>\n<p>\u00a0<br \/>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f:<\/p>\n<blockquote>\n<p> <strong>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0301\u0446\u0438\u044f<\/strong> \u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445\u00a0\u2014 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043b\u044f \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u044b\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0433\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80\" rel=\"noopener noreferrer nofollow\">\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440<\/a>, \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435<\/a>. \u0414\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0443 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 (\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435). <\/p>\n<\/blockquote>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043b\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0432 \u0432\u0438\u0434\u0435 \u0438\u0445 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u0432(username), \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u0445, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0411\u0414. \u041f\u043e\u0438\u0441\u043a \u0432 \u0411\u0414 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u0435\u0440\u0435\u0447\u043d\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432(\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u0437 \u0432\u0438\u043a\u0438\u0441\u043b\u043e\u0432\u0430\u0440\u044f)<\/p>\n<h2>\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0435\u0431\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u0432 credentials \u043e\u0442\u043e\u0448\u043b\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 username, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0412\u043e\u0432\u0430\u043d. <\/p>\n<figure class=\"full-width\"><figcaption>\u041a\u0442\u043e-\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0412\u043e\u0432\u0430\u043d\u043e\u043c<\/figcaption><\/figure>\n<p>\u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u043e\u0441\u0442 \u2013 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0412\u043e\u0432\u0430\u043d\u0430. \u042d\u0442\u043e \u0434\u044b\u0440\u0430 \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0412\u043e\u0432\u0430\u043d\u043e\u043c(prove user\u2019s identity). <\/p>\n<p>\u0412\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u0435\u0442\u0435, \u043a\u0430\u043a \u0412\u043e\u0432\u0430\u043d \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u0438 \u0435\u0441\u0442\u044c \u0412\u043e\u0432\u0430\u043d.<\/p>\n<p>\u0421\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0412\u043e\u0432\u0430\u043d \u044d\u0442\u043e \u0412\u043e\u0432\u0430\u043d, \u0443\u0436\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443 \u043d\u0435\u0433\u043e.\u00a0 \u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0412\u043e\u0432\u0430\u043d\u0430 \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u044e\u0434\u0435\u0439 \u0438 \u0447\u0442\u043e \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d? \u041d\u0430\u0431\u043e\u0440 \u0430\u0442\u043e\u043c\u043e\u0432? \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0414\u041d\u041a?<\/p>\n<p>&#8212; \u0412\u043e\u0432\u0430\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442 \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0435\u0433\u043e \u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u043e\u043b\u043e\u0441\u044b. \u041f\u0443\u0441\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u0438 \u0442\u043e, \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u043e\u043b\u043e\u0441\u044b.<\/p>\n<p>&#8212; \u0410 \u0435\u0449\u0435 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0430\u043a\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0422\u0443\u0437\u0438\u043a.<\/p>\n<p>&#8212; \u0415\u0449\u0435 \u0435\u0433\u043e \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0446\u0432\u0435\u0442 \u2013 \u043a\u0440\u0430\u0441\u043d\u044b\u0439.<\/p>\n<p>&#8212; \u0410 \u0432\u0435\u0434\u044c \u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u0432\u0441\u0435 \u0444\u0430\u043a\u0442\u044b \u043e \u043d\u0435\u043c. \u0415\u0433\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430<\/p>\n<p>&#8212; \u041f\u0443\u0441\u0442\u044c \u0412\u043e\u0432\u0430\u043d \u0441\u0430\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0444\u0430\u043a\u0442 \u043e \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0432\u0435\u0440\u0438\u043b\u0430 \u0435\u043c\u0443. \u041d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u0442 \u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430.<\/p>\n<p>&#8212; \u042d\u0442\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0431\u0443\u0434\u0435\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0444\u0440\u0430\u0437\u0430? \u041e\u0434\u0438\u043d \u0444\u0430\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 <\/p>\n<p>\u0412\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-336922","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/336922","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=336922"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/336922\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=336922"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=336922"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=336922"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}