рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА рднрд╛рдЧ 4: HTTP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлреНрд▓рд╛рд╕реНрдХ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд

рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА рднрд╛рдЧ 0: рддреБрд▓рдирд╛ рд╕реЗрд╡реЗрд▓реНрдЯ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА рднрд╛рдЧ 1: рд╕реНрд╡реЗрд▓реЗрдЯ рдФрд░ рдХреИрдирд╡рд╕ 2 рдбреА
рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА рднрд╛рдЧ 2: рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдкреВрд░реНрд╡рд╡рдд рдХрд░реЗрдВ / рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ
рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА, рднрд╛рдЧ 3: рдХрдорд╛рдВрдб рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд╕рд╛рде рдкреВрд░реНрд╡рд╡рдд рдХрд░реЗрдВ / рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ
рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА рднрд╛рдЧ 4: HTTP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлреНрд▓рд╛рд╕реНрдХ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рд╕реЗ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдлреНрд▓рд╛рд╕реНрдХ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ Svelte рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдлреНрд▓рд╛рд╕реНрдХ рдкрд░ рдмреИрдХрдПрдВрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЛ рдКрдкрд░ рдЙрдард╛рдирд╛ Boost.Beast рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдлреНрд▓рд╛рд╕реНрдХ рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ред рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛ, Boost.Beast рдЙрджрд╛рд╣рд░рдг рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рд╣реЛрдЧрд╛ред


рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрдерд╛рдкрдирд╛

рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ docker рдФрд░ docker-compose рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВред


рд╣рдо рдЖрдкрдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреНрд▓реЛрди рдХрд░рддреЗ рд╣реИрдВ:


git clone https://github.com/nomhoi/tic-tac-toe-part4.git 

рдХрдВрдЯреЗрдирд░ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ:


 cd tic-tac-toe-part4 docker-compose up -d 

рд╣рдо рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ:


 cd front npm install npm run-script build 

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ http: // localhost рдкрд░ рдЦреЛрд▓реЗрдВред рд╡рд┐рдВрдбреЛрдЬ рдорд╢реАрди рдкрд░, рд╣рдо рдорд╢реАрди рдХреЗ рдЖрдИрдкреА рдбреЙрдХрдЯрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рдЖрдорддреМрд░ рдкрд░ рдпрд╣ http://192.168.99.100 рд╣реИ ред


рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рджрд╛рдИрдВ рдУрд░ рдмрдЯрди рдмрдЯрди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдЗрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмреИрдХрдПрдВрдб рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ - рдЕрдиреБрд░реЛрдз http: // рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ / рдирдВрдмрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ 0 рд╕реЗ 8 рд╕рдорд╛рд╡реЗрд╢реА рддрдХ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрддрд┐рд╣рд╛рд╕ .push рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЦреЗрд▓ рдореИрджрд╛рди рдкрд░ рдПрдХ рдХреНрд░реЙрд╕ рдпрд╛ рд╢реВрдиреНрдп рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХрдХреНрд╖ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдХ рд╡реНрдпрд╕реНрдд рд╕рдВрджреЗрд╢ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред


рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣рдм рдкрд░ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП docker рдФрд░ docker-compose рдкрд░ рдПрдХ рдЕрджреНрднреБрдд рд▓реЗрдЦ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдпрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реВрдВрдЧрд╛ред Docker-compose.yml рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╕реЗрд╡рд╛рдПрдВ рд╣реИрдВ: рдирдЧрдиреЗрдХреНрд╕ рдФрд░ рдлреНрд▓рд╛рд╕реНрдХ ред


рдбреЛрдХрд░-compose.yml:


 version: "3.5" services: nginx: image: nginx:alpine container_name: nginx volumes: - ./front/public:/usr/share/nginx/html - ./default.conf:/etc/nginx/conf.d/default.conf:ro ports: - "80:80" depends_on: - flask networks: - backend flask: build: context: flask/ dockerfile: Dockerfile ports: - "5000:5000" volumes: - ./flask:/code environment: FLASK_ENV: development networks: - backend networks: backend: name: backend 

Nginx рд╕реЗрд╡рд╛ nginx рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рддрд╣рдд рд╣рдорд╛рд░рд╛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдлреНрд▓рд╛рд╕реНрдХ рд╕реЗрд╡рд╛ рд╣рдорд╛рд░реЗ рдЫреЛрдЯреЗ рдмреИрдХрдПрдВрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдлреНрд▓рд╛рд╕реНрдХ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреА рд╣реИред


рджреГрд╢реНрдпрдкрдЯрд▓

рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рдЕрдиреНрдп рдбрд┐рд╕реНрдкреИрдЪрд░ рдШрдЯрдХ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдмреИрдХрдПрдВрдб рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИред


Dispatcher.svelte:


 <script> import { history, status } from './stores.js'; import { Command } from './helpers.js'; let promise = null; async function getRandomNumber() { const res = await fetch(`number`); const text = await res.text(); if (res.ok) { let i = parseInt(text); if ($status === 1 || $history.state.squares[i]) return text + ' - busy'; history.push(new Command($history.state, i)); return text; } else { throw new Error(text); } } function handleClick() { promise = getRandomNumber(); } //setInterval(handleClick, 500); </script> {#if $status > 0} <button disabled> Get random number </button> {:else} <button on:click={handleClick}> Get random number </button> {/if} {#await promise} <p>...</p> {:then number} <p>Respond from backend: {number}</p> {:catch error} <p style="color: red">{error.message}</p> {/await} 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреЛрдб рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред GetRandomNumber () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирдВрдмрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, URI http: // localhost / рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, nginx рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдиреА рдореЗрдВ рдПрдХ рдХрджрдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдк рдПрдХ рдЕрд▓рдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЯреИрдм рдореЗрдВ рдкрддрд╛ http: // localhost / рдирдВрдмрд░ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдирдВрдмрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВред


Nginx рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ default.conf рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛:


 location /number { proxy_pass http://flask:5000; } 

рдЗрд╕ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдмреИрдХрдПрдВрдб рдЕрдиреБрд░реЛрдз рд╕рд░реНрд╡рд░ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдмреИрдХрдПрдВрдб

рдлреНрд▓рд╛рд╕реНрдХ рд╕реЗрд╡рд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдЖрдзрд╛рд░ рдпрд╣рд╛рдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://docs.docker.com/compose/gettingstarted/ ред


App.py:


 from flask import Flask from random import randrange app = Flask(__name__) @app.route('/number') def number(): return str(randrange(9)) 

рдЬрдм рдПрдХ рдкрддрд╛ / рдирдВрдмрд░ рдкрд░ рдЕрдиреБрд░реЛрдз рдЖрддрд╛ рд╣реИ, рддреЛ рдирдВрдмрд░ () рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ 0 рд╕реЗ 8 рддрдХ рдХреА рд╕реАрдорд╛ рдореЗрдВ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдЖ рдЧрдИ рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖

рдЖрдорддреМрд░ рдкрд░, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рдВрджреЗрд╢ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдПрдХ рдмрд╣реБ-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд┐рд╕реА рдЕрдиреНрдп рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЗрд▓рддрд╛ рд╣реИред рдЖрдк рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдЦрд┐рд▓рд╛рдбрд╝реА рд╕рд░реНрд╡рд░ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рдмреБрджреНрдзрд┐рдорд╛рди рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддрд╛ рд╣реИ, рдФрд░ рдлреНрд░рдВрдЯ-рдПрдВрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдирд╣реАрдВред


рдЧрд┐рдЯрд╣рдм рднрдВрдбрд╛рд░

https://github.com/nomhoi/tic-tac-toe-part4

Source: https://habr.com/ru/post/hi460621/


All Articles