2021 06 Flask
Flask Error Flask Blueprint

Flask Blueprint Directory Structure๐Ÿ“sampletest โ”œโ”€โ”€ ๐Ÿ“„publish.py โ””โ”€โ”€ ๐Ÿ“module โ”œโ”€โ”€ ๐Ÿ“„__init__.py โ””โ”€โ”€ ๐Ÿ“„publish.py# dbtest.py #-*- coding: utf-8 -*- from flask import Flask from mymodule import public app = Flask(__name__) app.register_blueprint(public.blueprint, url_prefix='/pages') @app.route('/') def hello_world(): return 'Hello World!' app.debug = True if __name__ == '__main__': app.run()#-*- coding: utf-8 -*- # public.py __author__ = 'namhadmin' from flask import Blueprint, render_template blueprint = Blueprint('public', __name__) @blueprint.route('/') def home(): #return render_template('public/home.html') return "blueprint test"

์ž‘์„ฑ์ผ :2021-06-30 00:11 / ์กฐํšŒ์ˆ˜: 126ํšŒ
2021 04 Flask
Flask Code Flask Json ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•

{flask ์—์„œ json ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•  ๋•Œ reqeust.get_json() ํ˜น์€ request.json ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, mime type์„ application/json ํƒ€์ž…์œผ๋กœ ๋ณด๋‚ด๋Š”๋ฐ, {} ์—†์ด ๋นˆ JSON ๋ฌธ์ž์—ด ์กฐ์ฐจ๋„ ์•ˆ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„์ˆ˜๊ฐ€ ์žˆ๋‹ค.from flask import Flaskย ย from flask import requestย ย app = Flask(__name__)@app.route("/test", methods=['POST'])def test():ย ย ย  ย  print request.json #request.get_json()ย  ย  return "Hello World!"์ด๋Ÿฐ ๊ฒฝ์šฐ flask ์—์„œ๋Š” 400 bad request ๋ฅผ ์‘๋‹ต๊ฐ’์œผ๋กœ ๋ณด๋‚ธ๋‹ค. ๋ณด๋‚ด๋Š” ์ด์œ ๋Š” parsing fail์ด ๋ฐœ์ƒํ•˜๊ณ  on_json_loading_failed(e) ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” JSON Decode ์‹คํŒจ ์‹œ 400 Bad Request๋ฅผ ๋ณด๋‚ด๋Š ๊ฒƒ์ด ๊ธฐ๋ณธ ๊ตฌํ˜„์œผ๋กœ ๋˜์–ด ์žˆ๋‹ค. JSON parsing fail ์ด ๋‚˜๋”๋ผ๋„ 400 Bad Request ์™ธ์˜ ๋‹ค๋ฅธ ํ–‰๋™์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.1. on_json_loading_failed() ์žฌ์ •์˜ ํ•˜๊ธฐ์•ž์„œ on_json_loading_failed ํ•จ์ˆ˜๋กœ ์ธํ•ด์„œ 400 Bad Request ๊ฐ€ ๋ฆฌํ„ด๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ์žฌ์ •์˜ ํ•˜๊ณ , ์žฌ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ request.on_json_loading_failed ์— ์—ฐ๊ฒฐ ์‹œํ‚ฌ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์ด ์ข‹์€ ์ ์€ ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ ํ•จ์œผ๋กœ์จ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ JSON parsing fail ์ด ๋ฐœ์ƒ ํ–ˆ์„๋•Œ ๋Œ€์‘ ํ• ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, 400 bad request ์™€ ํ•จ๊ป˜ JSON ์‘๋‹ต์„ ๋ณด๋‚ด๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ํŠน์ •ํ•œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ํ•˜๋Š” ๋“ฑ์˜ ํ–‰๋™์„ ์ •์˜ ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.์•„๋ž˜์˜ ์˜ˆ์ œ์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๊ธฐ๋ณธ ๋นˆ dict์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜์˜€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋งˆ์Œ๋†“๊ณ  get_json()์„ ์‚ฌ์šฉ ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.def on_json_loading_failed_return_dict(e):ย ย ย  ย  return {}@app.route("/test", methods=['POST'])def test():ย ย ย  ย  request.on_json_loading_failed = on_json_loading_failed_return_dictย  ย  print request.get_json()ย  ย  return "Hello World!"ย 2. get_json() silent ํŒŒ๋ผ๋ฏธํ„ฐ ํ™œ์šฉget_json() ํ•จ์ˆ˜๋Š” ๋ช‡๊ฐ€์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ๊ทธ ์ค‘์—์„œ silent ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” JSON parsing fail ์— ๋Œ€ํ•ด์„œ None ์ฒ˜๋ฆฌ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์„ False์ธ๋ฐ, ๋ช…์‹œ์ ์œผ๋กœ True ๋กœ ์ฃผ๋ฉด get_json() ํ˜ธ์ถœ์‹œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๊ณ  None์„ ๋ฆฌํ„ดํ•œ๋‹ค.print request.get_json(silent=True)ย ย Parameters:force โ€“ if set to True the mimetype is ignored.silent โ€“ if set to True this method will fail silently and return None.cache โ€“ if set to True the parsed JSON data is remembered on the request.์–ด๋–ค ๋ฐฉ์‹์„ ์„ ํ˜ธํ•˜๋Š”์ง€๋Š” ๊ฐœ์ธ์ด๋‚˜ ํ”„๋กœ์ ํŠธ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ๊ฒƒ ๊ฐ™๋‹ค. ๋ชจ๋“  API๊ฐ€ JSON ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด, on_json_loading_failed() ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ  decorator ๋“ฑ์„ ํ™œ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์„๊ฒƒ ๊ฐ™๋‹ค. (ํ•„์ž ์—ญ์‹œ ์ตœ๊ทผ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ™œ์šฉํ–ˆ๋‹ค.)์ฐธ๊ณ ๋กœ flask 0.11 ๋ฒ„์ „์—์„œ๋Š” is_json ์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”๋ฐ ์ด๊ฒƒ์€ parsing fail ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, mimetype ์ด application/json ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ True | False ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ž‘์„ฑ์ผ :2021-04-28 06:05 / ์กฐํšŒ์ˆ˜: 215ํšŒ
2021 04 Flask
Flask Code flask request ๋ฐ์ดํ„ฐ

The docs describe the attributes available on the request. In most common cases request.data will be empty because it's used as a fallback: request.data Contains the incoming request data as string in case it came with a mimetype Flask does not handle. request.args: the key/value pairs in the URL query string request.form: the key/value pairs in the body, from a HTML post form, or JavaScript request that isn't JSON encoded request.files: the files in the body, which Flask keeps separate from form. HTML forms must use enctype=multipart/form-data or files will not be uploaded. request.values: combined args and form, preferring args if keys overlap request.json: parsed JSON data. The request must have the application/json content type, or use request.get_json(force=True) to ignore the content type. All of these are MultiDict instances (except for json). You can access values using: request.form['name']: use indexing if you know the key exists request.form.get('name'): use get if the key might not exist request.form.getlist('name'): use getlist if the key is sent multiple times and you want a list of values. get only returns the first value.

์ž‘์„ฑ์ผ :2021-04-24 08:34 / ์กฐํšŒ์ˆ˜: 114ํšŒ
2021 04 flask
Flask Code Flask apache WSGIPassAuthorization

์ด๋ฏธ์ง€ ์‚ฝ์ž… Raspberry Pi List ์‹œ๋ฆฌ์ฆˆ ย ย  #1. Monitoring ๊ฐœ์š”, wflask.conf์— VirtualHost ์„ค์ •์œผ๋กœ ์ถ”๊ฐ€WSGIPassAuthorization on

์ž‘์„ฑ์ผ :2021-04-11 14:39 / ์กฐํšŒ์ˆ˜: 201ํšŒ
2021 04 Flask
Flask Code Flask + apache2 + mod_wsgi

์ด๋ฏธ์ง€ ์‚ฝ์ž… Raspberry Pi List ์‹œ๋ฆฌ์ฆˆ ย ย  #1. Default ๊ฐœ์š”, Apache2 + Flask + mod_wsgi ์—ฐ๊ฒฐ ๋- not ssl / not multi wsgi์•„ํŒŒ์น˜ ์„œ๋ฒ„ ์„ค์ • : /etc/apache2/apache2.conf ์•„ํŒŒ์น˜ VirtualHost ์„ค์ • : /etc/apache2/site-available/default.conf ์•„ํŒŒ์น˜ ์›น์„œ๋ฒ„ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ณธ ์„ค์ • : /etc/apache2/site-available/000-default.conf #์šฐ๋ถ„ํˆฌ ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ $sudo apt-get update #์•„ํŒŒ์น˜2 ์„ค์น˜ $sudo apt-get install apache2 #wsgi ์„ค์น˜ (web server gateway interface server ์„ค์น˜ = middleware) $sudo apt-get install libapache2-mod-wsgi-py3 $sudo a2enmod wsgi -- ์•ˆํ•ด๋„ ๋จ ์œ„์— ๋ช…๋ น์–ด์—์„œ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ #pip ๋ฐฐํฌ ํŒจํ‚ค์ง€ ์„ค์น˜ $sudo apt-get install python3-pip #pip ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ $sudo pip3 install --upgrade pip #flask ์›น ํ”„๋ ˆ์ž„์›Œํฌ ์„ค์น˜ $sudo pip3 install flask $cd ~/ $sudo mkdir flask $sudo ln -sT ~/flask /var/www/flask #๋งํฌ ํŒŒ์ผ ์ƒ์„ฑ(์‹ฌ๋ณผ๋ฆญ ๋งํฌ: ์œˆ๋„์šฐ ๋ฐ”๋กœ๊ฐ€๊ธฐ์™€ ์œ ์‚ฌ) ln ์˜ต์…˜ ์›๋ณธํŒŒ์ผ ๋Œ€์ƒํŒŒ์ผ $cd flask$sudo vi flaskapp.py from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' $sudo vi app.wsgi import sys sys.path.insert(0, '/var/www/flask') from flaskapp import app as application$sudo vi /etc/apache2/sites-available/flask.conf <VirtualHost *:80> ServerName localhost WSGIDaemonProcess app threads=5 WSGIScriptAlias / /var/www/flask/app.wsgi DocumentRoot /var/www/flask <Directory /var/www/flask> WSGIProcessGroup app WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>$cd /etc/apache2/sites-available $sudo a2dissite 000-default $sudo a2ensite flask.conf $sudo service apache2 restart$vi /etc/apache2/apache2.conf <document /> ์‚ญ์ œ#2. multiple apps๊ฐœ์š”,์„œ๋ฒ„์ด๋ฆ„, wsgi, ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„ ๋ณ€๊ฒฝ$sudo vi /etc/apache2/sites-available/flask.conf <VirtualHost *:80> ServerName calcs.kr WSGIDaemonProcess app threads=5 WSGIScriptAlias / /var/www/flask/app.wsgi DocumentRoot /var/www/flask <Directory /var/www/flask> WSGIProcessGroup app WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> <VirtualHost *:80> ServerName percent.calcs.kr WSGIDaemonProcess percent threads=5 WSGIScriptAlias / /var/www/flask/app.wsgi DocumentRoot /var/www/flask <Directory /var/www/flask> WSGIProcessGroup percent WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> #3. ssl๊ฐœ์š”,SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰$apt install letsencrypt$service apache2 stop$sudo letsencrypt certonly -w /var/www -d calcs.kr -d percent.calcs.kr1๋ฒˆ(standalone)AN/etc/letsencrypt/live/[domain]/ํŒŒ์ผ๋“ค์€ ์ด 4๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.cert.pem : ์ธ์ฆ์„œ ํŒŒ์ผchain.pem : ์ธ์ฆ์„œ ๋ฐœ๊ธ‰์ž ํŒŒ์ผfullchain.pem : cert.pem+chain.pemprivkey.pem : ์ธ์ฆ์•”ํ˜ธ๋ฅผ ๋ณตํ˜ธํ™”ํ•˜๋Š” ๊ฐœ์ธํ‚คcp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/back-ssl.conf$vi /etc/apache2/sites-available/back-ssl.conf SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA SSLHonorCipherOrder on SSLCertificateFile โ€œ/etc/letsencrypt/live/[ํด๋”๋ช…]/cert.pemโ€ SSLCertificateKeyFile โ€œ/etc/letsencrypt/live/[ํด๋”๋ช…]/privkey.pemโ€ SSLCertificateChainFile โ€œ/etc/letsencrypt/live/[ํด๋”๋ช…]/chain.pemโ€ SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire ์ฃผ์„ ํ•ด์ œ<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin reasley.com@gamil.com DocumentRoot /var/www/ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf # SSL Engine Switch: # Enable/Disable SSL for this virtual host. SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLHonorCipherOrder on SSLCertificateFile "/etc/letsencrypt/live/reasley.com-0001/cert.pem" SSLCertificateKeyFile "/etc/letsencrypt/live/reasley.com-0001/privkey.pem" SSLCertificateChainFile "/etc/letsencrypt/live/reasley.com-0001/chain.pem" # A self-signed (snakeoil) certificate can be created by installing # the ssl-cert package. See # /usr/share/doc/apache2/README.Debian.gz for more info. # If both key and certificate are stored in the same file, only the # SSLCertificateFile directive is needed. #SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key # Server Certificate Chain: # Point SSLCertificateChainFile at a file containing the # concatenation of PEM encoded CA certificates which form the # certificate chain for the server certificate. Alternatively # the referenced file can be the same as SSLCertificateFile # when the CA certificates are directly appended to the server # certificate for convinience. #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt # Certificate Authority (CA): # Set the CA certificate verification path where to find CA # certificates for client authentication or alternatively one # huge file containing all of them (file must be PEM encoded) # Note: Inside SSLCACertificatePath you need hash symlinks # to point to the certificate files. Use the provided # Makefile to update the hash symlinks after changes. #SSLCACertificatePath /etc/ssl/certs/ #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt # Certificate Revocation Lists (CRL): # Set the CA revocation path where to find CA CRLs for client # authentication or alternatively one huge file containing all # of them (file must be PEM encoded) # Note: Inside SSLCARevocationPath you need hash symlinks # to point to the certificate files. Use the provided # Makefile to update the hash symlinks after changes. #SSLCARevocationPath /etc/apache2/ssl.crl/ #SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl # Client Authentication (Type): # Client certificate verification type and depth. Types are # none, optional, require and optional_no_ca. Depth is a # number which specifies how deeply to verify the certificate # issuer chain before deciding the certificate is not valid. #SSLVerifyClient require #SSLVerifyDepth 10 # SSL Engine Options: # Set various options for the SSL engine. # o FakeBasicAuth: # Translate the client X.509 into a Basic Authorisation. This means that # the standard Auth/DBMAuth methods can be used for access control. The # user name is the `one line' version of the client's X.509 certificate. # Note that no password is obtained from the user. Every entry in the user # file needs this password: `xxj31ZMTZzkVA'. # o ExportCertData: # This exports two additional environment variables: SSL_CLIENT_CERT and # SSL_SERVER_CERT. These contain the PEM-encoded certificates of the # server (always existing) and the client (only existing when client # authentication is used). This can be used to import the certificates # into CGI scripts. # o StdEnvVars: # This exports the standard SSL/TLS related `SSL_*' environment variables. # Per default this exportation is switched off for performance reasons, # because the extraction step is an expensive operation and is usually # useless for serving static content. So one usually enables the # exportation for CGI and SSI requests only. # o OptRenegotiate: # This enables optimized SSL connection renegotiation handling when SSL # directives are used in per-directory context. SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> # SSL Protocol Adjustments: # The safe and default but still SSL/TLS standard compliant shutdown # approach is that mod_ssl sends the close notify alert but doesn't wait for # the close notify alert from client. When you need a different shutdown # approach you can use one of the following variables: # o ssl-unclean-shutdown: # This forces an unclean shutdown when the connection is closed, i.e. no # SSL close notify alert is send or allowed to received. This violates # the SSL/TLS standard but is needed for some brain-dead browsers. Use # this when you receive I/O errors because of the standard approach where # mod_ssl sends the close notify alert. # o ssl-accurate-shutdown: # This forces an accurate shutdown when the connection is closed, i.e. a # SSL close notify alert is send and mod_ssl waits for the close notify # alert of the client. This is 100% SSL/TLS standard compliant, but in # practice often causes hanging connections with brain-dead browsers. Use # this only for browsers where you know that their SSL implementation # works correctly. # Notice: Most problems of broken clients are also related to the HTTP # keep-alive facility, so you usually additionally want to disable # keep-alive for those clients, too. Use variable "nokeepalive" for this. # Similarly, one has to force some clients to use HTTP/1.0 to workaround # their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and # "force-response-1.0" for this. # BrowserMatch "MSIE [2-6]" \ # nokeepalive ssl-unclean-shutdown \ # downgrade-1.0 force-response-1.0 </VirtualHost> </IfModule> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet sudo a2enmod ssl sudo a2ensite back-ssl sudo ufw allow 443/tcp sudo service apache2 restart123

์ž‘์„ฑ์ผ :2021-04-08 15:53 / ์กฐํšŒ์ˆ˜: 246ํšŒ
  • <<
  • 1
  • >>

์†Œ๊ฐœ๊ธ€

์›ํฌ์˜ฌ ์„ ์ž„ ์—ฐ๊ตฌ์›

Kshield Jr. 2๊ธฐ ์ธ์ฆ์ƒ

Cyber Guardians ์ˆ˜๋ฃŒ์ƒ

ํ”Œ๋Ÿฌํ„ฐ ์•ฑ ๊ฐœ๋ฐœ ๊ฐ•์‚ฌ

ํ”Œ๋ผ์Šคํฌ ์›น ๊ฐœ๋ฐœ ๊ฐ•์‚ฌ

LG ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์กฐ๊ฐ•์‚ฌ

๋ฉ€ํ‹ฐ์บ ํผ์Šค ์•…์„ฑ์ฝ”๋“œ ๋ณด์กฐ๊ฐ•์‚ฌ

๋ฉ€ํ‹ฐ์บ ํผ์Šค ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์กฐ๊ฐ•์‚ฌ

๊ธˆ์œต๊ฐ๋…์› ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์กฐ๊ฐ•์‚ฌ

<์‹œ์Šคํ…œ ํ•ดํ‚น ํ”„๋กœํ† ์Šคํƒ€> ์ €์ž

<์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ๊ฐœ๋ฐœ์— ๋”ฑ ๋งž๋Š” ํ”Œ๋Ÿฌํ„ฐ์™€ ๋‹คํŠธ ์ž…๋ฌธ> ์ €์ž

๋ฌธ์˜: reasley.com@gmail.com

Category

Project List

Percent

JustCat

TextCount

Weather

Percent

Percent