python>flask>fastcampus2>
code .
Ctrl + `
python -m venv ./venv
ctrl + shift + p
python select interpreter
venv 설정 (fatal error in launcher-시스템-고급 시스템 설정 보기-환경변수-편집)
가상환경 command prompt
cd /venv/Scripts/
activate
cd ..
cd ..
pip install flask
B:\python\flask\project\venv\Scripts\python.exe -m pip install --upgrade pip
app.py--------------------
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return '안녕 Flask!'
if __name__ == "__main__":
app.run(host='0.0.0.0', port='5000', debug=True)
====================
python app.py
http://192.168.1.65:5000/
안녕 Flask
git config --global user.name "jeong~"
git config --global user.email "i~@gmail.com"
git config --list
vscode -터미널-새터미널Ctrl+Shift+`
git init
.gitignore
https://github.com/pallets/flask/blob/main/.gitignore
git add .
git status
git commit -m "flask2 first commit"
https://github.com/jeongyongman/flask_fastcampus2
git remote add origin https://github.com/jeongyongman/flask_fastcampus2.git
git remote -v
git push origin master
Chapter 09. REST 맛보기 - 01. 회원 생성 API 만들기
app.py--------------------
from flask import Flask
from flask import render_template
from api_v1 import api as api_v1
app = Flask(__name__)
app.register_blueprint(api_v1, url_prefix='/api/v1')
@app.route('/register')
def register():
return render_template('register.html')
@app.route('/')
def hello():
return '<h1>Hello World!</h1>'
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
====================
api_v1>user.py--------------------
from flask import jsonify
from . import api
@api.route('/test')
def test():
return jsonify()
====================
models.py--------------------
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Fcuser(db.Model):
__tablename__ = 'fcuser'
id = db.Column(db.Integer, primary_key=True)
password = db.Column(db.String(64))
userid = db.Column(db.String(32))
username = db.Column(db.String(8))
====================
models.py--------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>회원가입</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="username">사용자 이름</label>
<input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<div class="form-group">
<label for="re-password">비밀번호 확인</label>
<input type="password" class="form-control" id="re-password" placeholder="비밀번호 확인" name="re-password">
</div>
<button type="submit" class="btn btn-primary">등록</button>
</form>
</div>
</div>
</div>
</body>
</html>
====================
python app.py
http://192.168.1.65:5000/api/v1/test
{}
git add .
git commit -m "회원 모델, register 뷰 만들기"
git push origin master
Chapter 09. REST 맛보기 - 01. 회원 생성 API 만들기
app.py--------------------
from flask import Flask
from flask import render_template
from models import db
from api_v1 import api as api_v1
app = Flask(__name__)
app.register_blueprint(api_v1, url_prefix='/api/v1')
@app.route('/register')
def register():
return render_template('register.html')
@app.route('/')
def hello():
return '<h1>Hello World!</h1>'
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
db.init_app(app)
db.app = app
db.create_all()
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
====================
templates>register.html--------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>회원가입</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post" action="/api/v1/users">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="username">사용자 이름</label>
<input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<div class="form-group">
<label for="re-password">비밀번호 확인</label>
<input type="password" class="form-control" id="re-password" placeholder="비밀번호 확인" name="re-password">
</div>
<button type="submit" class="btn btn-primary">등록</button>
</form>
</div>
</div>
</div>
</body>
</html>
====================
api_v1>user.py--------------------
from flask import jsonify
from flask import request
from models import Fcuser, db
from . import api
@api.route('/users', methods=['GET','POST'])
def users():
if request.method == 'POST':
userid = request.form.get('userid')
username = request.form.get('username')
password = request.form.get('password')
re_password = request.form.get('re-password')
if not (userid and username and password and re_password):
return jsonify({'error': 'No arguments'}), 400
if password != re_password:
return jsonify({'error': 'Wrong password'}), 400
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return jsonify(), 201
return jsonify()
====================
192.168.1.65:5000/register
miero
미에로
1234
1234
// 20220401154529
// http://192.168.1.65:5000/api/v1/users
{
}
git add .
git commit -m "REST 맛보기 - 회원 생성 API 만들기"
git push origin master
Chapter 09. REST 맛보기 - 02. 회원 목록 API 만들기
api_v1>user.py--------------------
from flask import jsonify
from flask import request
from models import Fcuser, db
from . import api
@api.route('/users', methods=['GET','POST'])
def users():
if request.method == 'POST':
userid = request.form.get('userid')
username = request.form.get('username')
password = request.form.get('password')
re_password = request.form.get('re-password')
if not (userid and username and password and re_password):
return jsonify({'error': 'No arguments'}), 400
if password != re_password:
return jsonify({'error': 'Wrong password'}), 400
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return jsonify(), 201
users = Fcuser.query.all()
return jsonify()
====================
models.py--------------------
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Fcuser(db.Model):
__tablename__ = 'fcuser'
id = db.Column(db.Integer, primary_key=True)
password = db.Column(db.String(64))
userid = db.Column(db.String(32))
username = db.Column(db.String(8))
@property
def serialize(self):
return {
'id': self.id,
'password': self.password,
'userid': self.userid,
'username': self.username
}
====================
api_v1>user.py--------------------
from flask import jsonify
from flask import request
from models import Fcuser, db
from . import api
@api.route('/users', methods=['GET','POST'])
def users():
if request.method == 'POST':
userid = request.form.get('userid')
username = request.form.get('username')
password = request.form.get('password')
re_password = request.form.get('re-password')
if not (userid and username and password and re_password):
return jsonify({'error': 'No arguments'}), 400
if password != re_password:
return jsonify({'error': 'Wrong password'}), 400
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return jsonify(), 201
users = Fcuser.query.all()
return jsonify([user.serialize for user in users])
====================
http://192.168.1.65:5000/api/v1/users
// 20220401160806
// http://192.168.1.65:5000/api/v1/users
[
{
"id": 1,
"password": "1234",
"userid": "miero",
"username": "미에로"
}
]
git add .
git commit -m "REST 맛보기 - 회원 목록 API 만들기"
git push origin master
Chapter 09. REST 맛보기 - 03. 회원 상세 읽기,수정,삭제 완성하기 (CRUD 완성하기)
api_v1>user.py--------------------
from flask import jsonify
from flask import request
from models import Fcuser, db
from . import api
@api.route('/users', methods=['GET','POST'])
def users():
if request.method == 'POST':
userid = request.form.get('userid')
username = request.form.get('username')
password = request.form.get('password')
re_password = request.form.get('re-password')
if not (userid and username and password and re_password):
return jsonify({'error': 'No arguments'}), 400
if password != re_password:
return jsonify({'error': 'Wrong password'}), 400
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return jsonify(), 201
users = Fcuser.query.all()
return jsonify([user.serialize for user in users])
@api.route('/users/<uid>', methods=['GET', 'PUT', 'DELETE'])
def user_detail(uid):
if request.method == 'GET':
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
====================
192.168.1.65:5000/register
newstep
뉴스텝
1234
1234
// 20220401174229
// http://192.168.1.65:5000/api/v1/users/1
{
"id": 1,
"password": "1234",
"userid": "miero",
"username": "미에로"
}
api_v1>user.py--------------------
from flask import jsonify
from flask import request
from models import Fcuser, db
from . import api
@api.route('/users', methods=['GET','POST'])
def users():
if request.method == 'POST':
userid = request.form.get('userid')
username = request.form.get('username')
password = request.form.get('password')
re_password = request.form.get('re-password')
if not (userid and username and password and re_password):
return jsonify({'error': 'No arguments'}), 400
if password != re_password:
return jsonify({'error': 'Wrong password'}), 400
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return jsonify(), 201
users = Fcuser.query.all()
return jsonify([user.serialize for user in users])
@api.route('/users/<uid>', methods=['GET', 'PUT', 'DELETE'])
def user_detail(uid):
if request.method == 'GET':
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
elif request.method == "DELETE":
Fcuser.query.delete(Fcuser.id == uid)
return jsonify(), 204
====================
api_v1>user.py--------------------
from json import JSONDecodeError
from flask import jsonify
from flask import request
from models import Fcuser, db
from . import api
@api.route('/users', methods=['GET','POST'])
def users():
if request.method == 'POST':
userid = request.form.get('userid')
username = request.form.get('username')
password = request.form.get('password')
re_password = request.form.get('re-password')
if not (userid and username and password and re_password):
return jsonify({'error': 'No arguments'}), 400
if password != re_password:
return jsonify({'error': 'Wrong password'}), 400
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return jsonify(), 201
users = Fcuser.query.all()
return jsonify([user.serialize for user in users])
@api.route('/users/<uid>', methods=['GET', 'PUT', 'DELETE'])
def user_detail(uid):
if request.method == 'GET':
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
elif request.method == "DELETE":
Fcuser.query.delete(Fcuser.id == uid)
return jsonify(), 204
data = request.get_json()
userid = data.form.get('userid')
username = data.form.get('username')
password = data.form.get('password')
updated_data = {}
if userid:
updated_data['userid'] = userid
if username:
updated_data['username'] = username
if password:
updated_data['password'] = password
Fcuser.query.filter(Fcuser.id == uid).update(updated_data)
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
====================
별도 cmd 터미널 열어서
curl -XPUT -H "Content-Type: application/json; charset=utf-8" -d '{"userid":"alghost"}' http://192.168.1.65:5000/api/v1/users/1
13:49 안되네
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)</p>
Chapter 10. jQuery와 JWT - 01. jQuery 기초 & ajax의 원리
view 페이지가 만들어져 있는 상태에서
api를 만들어서 데이터만 전달하면
ajax를 이용하여 비동기로 데이터만 전달하여 홈페이지 이동이나 리로드없이
데이터를 반영하는데
Javascript를 사용해서 만들어야 되나
이를 쉽게 하기 위해서
jQuery를 사용한다
Chapter 10. jQuery와 JWT - 02. jQuery를 활용하여 회원기능 완성하기
jquery cdn 검색
jQuery 3.x minified 클릭 복사
jQuery CDN
The integrity and crossorigin attributes are used for Subresource Integrity (SRI) checking. This allows browsers to ensure that resources hosted on third-party servers have not been tampered with. Use of SRI is recommended as a best-practice, whenever libr
releases.jquery.com
templates>register.html--------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script>
function regist() {
$.ajax ({
url: '/api/v1/users',
method: 'GET'
}).done(function (res) {
console.log(res);
});
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>회원가입</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post" action="/api/v1/users">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="username">사용자 이름</label>
<input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<div class="form-group">
<label for="re-password">비밀번호 확인</label>
<input type="password" class="form-control" id="re-password" placeholder="비밀번호 확인" name="re-password">
</div>
<button type="button" class="btn btn-primary" onclick="regist();">등록</button>
</form>
</div>
</div>
</div>
</body>
</html>
======================
python app.py
http://192.168.1.65:5000/register
Ctrl + Shift + i
콘솔
templates>register.html--------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script>
// function regist() {
// $.ajax ({
// url: '/api/v1/users',
// method: 'GET'
// }).done(function (res) {
// console.log(res);
// });
// }
function regist() {
$.ajax ({
url: '/api/v1/users',
method: 'POST'
}).done(function (res) {
console.log(res);
});
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>회원가입</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post" action="/api/v1/users">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="username">사용자 이름</label>
<input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<div class="form-group">
<label for="re-password">비밀번호 확인</label>
<input type="password" class="form-control" id="re-password" placeholder="비밀번호 확인" name="re-password">
</div>
<button type="button" class="btn btn-primary" onclick="regist();">등록</button>
</form>
</div>
</div>
</div>
</body>
</html>
======================
api_v1>user.py--------------------
from flask import jsonify
from flask import request
from models import Fcuser, db
from . import api
@api.route('/users', methods=['GET','POST'])
def users():
if request.method == 'POST':
data = request.get_json()
userid = data.get('userid')
username = data.get('username')
password = data.get('password')
re_password = data.get('re-password')
if not (userid and username and password and re_password):
return jsonify({'error': 'No arguments'}), 400
if password != re_password:
return jsonify({'error': 'Wrong password'}), 400
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return jsonify(), 201
users = Fcuser.query.all()
return jsonify([user.serialize for user in users])
@api.route('/users/<uid>', methods=['GET', 'PUT', 'DELETE'])
def user_detail(uid):
if request.method == 'GET':
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
elif request.method == "DELETE":
Fcuser.query.delete(Fcuser.id == uid)
return jsonify(), 204
data = request.get_json()
# userid = data.get('userid')
# username = data.get('username')
# password = data.get('password')
# updated_data = {}
# if userid:
# updated_data['userid'] = userid
# if username:
# updated_data['username'] = username
# if password:
# updated_data['password'] = password
# Fcuser.query.filter(Fcuser.id == uid).update(updated_data)
Fcuser.query.filter(Fcuser.id == uid).update(data)
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
======================
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script>
// function regist() {
// $.ajax ({
// url: '/api/v1/users',
// method: 'GET'
// }).done(function (res) {
// console.log(res);
// });
// }
function regist() {
$.ajax ({
url: '/api/v1/users',
contentType: 'application/json',
method: 'POST',
data: JSON.stringify({
userid: $('#userid').value,
username: $('#username').value,
password: $('#password').value,
're-password': $('#re-password').value
})
}).done(function (res) {
console.log(res);
});
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>회원가입</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post" action="/api/v1/users">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="username">사용자 이름</label>
<input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<div class="form-group">
<label for="re-password">비밀번호 확인</label>
<input type="password" class="form-control" id="re-password" placeholder="비밀번호 확인" name="re-password">
</div>
<button type="button" class="btn btn-primary" onclick="regist();">등록</button>
</form>
</div>
</div>
</div>
</body>
</html>
======================
api_v1>user.py--------------------
from flask import jsonify
from flask import request
from models import Fcuser, db
from . import api
@api.route('/users', methods=['GET','POST'])
def users():
if request.method == 'POST':
data = request.get_json()
userid = data.get('userid')
username = data.get('username')
password = data.get('password')
re_password = data.get('re-password')
print(data)
if not (userid and username and password and re_password):
return jsonify({'error': 'No arguments'}), 400
if password != re_password:
return jsonify({'error': 'Wrong password'}), 400
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return jsonify(), 201
users = Fcuser.query.all()
return jsonify([user.serialize for user in users])
@api.route('/users/<uid>', methods=['GET', 'PUT', 'DELETE'])
def user_detail(uid):
if request.method == 'GET':
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
elif request.method == "DELETE":
Fcuser.query.delete(Fcuser.id == uid)
return jsonify(), 204
data = request.get_json()
# userid = data.get('userid')
# username = data.get('username')
# password = data.get('password')
# updated_data = {}
# if userid:
# updated_data['userid'] = userid
# if username:
# updated_data['username'] = username
# if password:
# updated_data['password'] = password
# Fcuser.query.filter(Fcuser.id == uid).update(updated_data)
Fcuser.query.filter(Fcuser.id == uid).update(data)
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
======================
192.168.1.65:5000/register
alghost
알고스트
1234
1234
{}
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script>
// function regist() {
// $.ajax ({
// url: '/api/v1/users',
// method: 'GET'
// }).done(function (res) {
// console.log(res);
// });
// }
function regist() {
$.ajax ({
url: '/api/v1/users',
contentType: 'application/json',
method: 'POST',
data: JSON.stringify({
userid: $('#userid').val(),
username: $('#username').val(),
password: $('#password').val(),
're-password': $('#re-password').val()
})
}).done(function (res) {
console.log(res);
});
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>회원가입</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post" action="/api/v1/users">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="username">사용자 이름</label>
<input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<div class="form-group">
<label for="re-password">비밀번호 확인</label>
<input type="password" class="form-control" id="re-password" placeholder="비밀번호 확인" name="re-password">
</div>
<button type="button" class="btn btn-primary" onclick="regist();">등록</button>
</form>
</div>
</div>
</div>
</body>
</html>
======================
192.168.1.65:5000/register
alghost
알고스트
1234
1234
{'userid': 'alghost', 'username': '알고스트', 'password': '1234', 're-password': '1234'}
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script>
// function regist() {
// $.ajax ({
// url: '/api/v1/users',
// method: 'GET'
// }).done(function (res) {
// console.log(res);
// });
// }
function regist() {
$.ajax ({
url: '/api/v1/users',
contentType: 'application/json',
method: 'POST',
data: JSON.stringify({
userid: $('#userid').val(),
username: $('#username').val(),
password: $('#password').val(),
're-password': $('#re-password').val()
})
}).done(function (res) {
// console.log(res);
alert('회원가입에 성공했습니다!')
window.location = '/';
});
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>회원가입</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post" action="/api/v1/users">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="username">사용자 이름</label>
<input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<div class="form-group">
<label for="re-password">비밀번호 확인</label>
<input type="password" class="form-control" id="re-password" placeholder="비밀번호 확인" name="re-password">
</div>
<button type="button" class="btn btn-primary" onclick="regist();">등록</button>
</form>
</div>
</div>
</div>
</body>
</html>
======================
api_v1>user.py--------------------
from flask import jsonify
from flask import request
from models import Fcuser, db
from . import api
@api.route('/users', methods=['GET','POST'])
def users():
if request.method == 'POST':
data = request.get_json()
userid = data.get('userid')
username = data.get('username')
password = data.get('password')
re_password = data.get('re-password')
if not (userid and username and password and re_password):
return jsonify({'error': 'No arguments'}), 400
if password != re_password:
return jsonify({'error': 'Wrong password'}), 400
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return jsonify(), 201
users = Fcuser.query.all()
return jsonify([user.serialize for user in users])
@api.route('/users/<uid>', methods=['GET', 'PUT', 'DELETE'])
def user_detail(uid):
if request.method == 'GET':
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
elif request.method == "DELETE":
Fcuser.query.delete(Fcuser.id == uid)
return jsonify(), 204
data = request.get_json()
# userid = data.get('userid')
# username = data.get('username')
# password = data.get('password')
# updated_data = {}
# if userid:
# updated_data['userid'] = userid
# if username:
# updated_data['username'] = username
# if password:
# updated_data['password'] = password
# Fcuser.query.filter(Fcuser.id == uid).update(updated_data)
Fcuser.query.filter(Fcuser.id == uid).update(data)
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
======================
git add .
git commit -m "jQuery와 JWT - 02.jQuery를 활용하여 회원기능 완성하기"
git push origin master
Chapter 10. jQuery와 JWT - 03. 복습, 로그인 뷰 만들기
templates>login.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script>
// function regist() {
// $.ajax ({
// url: '/api/v1/users',
// method: 'GET'
// }).done(function (res) {
// console.log(res);
// });
// }
function login() {
// $.ajax ({
// url: '/api/v1/users',
// contentType: 'application/json',
// method: 'POST',
// data: JSON.stringify({
// userid: $('#userid').val(),
// username: $('#username').val(),
// password: $('#password').val(),
// 're-password': $('#re-password').val()
// })
// }).done(function (res) {
// // console.log(res);
// alert('회원가입에 성공했습니다!')
// window.location = '/';
// });
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>로그인</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post" action="/api/v1/users">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<button type="button" class="btn btn-primary" onclick="login();">로그인</button>
</form>
</div>
</div>
</div>
</body>
</html>
======================
app.py--------------------
import os
from flask import Flask
from flask import render_template
from models import db
from api_v1 import api as api_v1
app = Flask(__name__)
app.register_blueprint(api_v1, url_prefix='/api/v1')
@app.route('/register')
def register():
return render_template('register.html')
@app.route('/login')
def login():
return render_template('login.html')
@app.route('/')
def hello():
return '<h1>Hello World!</h1>'
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
db.init_app(app)
db.app = app
db.create_all()
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
======================
git add .
git commit -m "jQuery와 JWT - 03. 복습, 로그인 뷰 만들기"
git push origin master
Chapter 10. jQuery와 JWT - 04. 토큰 기반 인증, JWT란
JWT - json web token
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
Chapter 10. jQuery와 JWT - 05. Flask-JWT를 이용한 인증 시스템 만들기
pip install Flask-JWT
templates>login.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script>
// function regist() {
// $.ajax ({
// url: '/api/v1/users',
// method: 'GET'
// }).done(function (res) {
// console.log(res);
// });
// }
function login() {
$.ajax ({
url: '/auth',
contentType: 'application/json',
method: 'POST',
data: JSON.stringify({
userid: $('#userid').val(),
password: $('#password').val(),
})
}).done(function (res) {
console.log(res);
// alert('회원가입에 성공했습니다!')
// window.location = '/';
});
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>로그인</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post" action="/api/v1/users">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<button type="button" class="btn btn-primary" onclick="login();">로그인</button>
</form>
</div>
</div>
</div>
</body>
</html>
======================
app.py--------------------
import os
from flask import Flask
from flask_jwt import JWT
from flask import render_template
from models import Fcuser, db
from api_v1 import api as api_v1
app = Flask(__name__)
app.register_blueprint(api_v1, url_prefix='/api/v1')
@app.route('/register')
def register():
return render_template('register.html')
@app.route('/login')
def login():
return render_template('login.html')
@app.route('/')
def hello():
return '<h1>Hello World!</h1>'
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
db.init_app(app)
db.app = app
db.create_all()
def authenticate(username, password):
user = Fcuser.query.filter(Fcuser.userid == username).first()
if user.password == password:
return user
jwt = JWT(app, authenticate)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
======================
templates>login.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script>
function login() {
$.ajax ({
url: '/auth',
contentType: 'application/json',
method: 'POST',
data: JSON.stringify({
username: $('#userid').val(),
password: $('#password').val(),
})
}).done(function (res) {
console.log(res);
// alert('회원가입에 성공했습니다!')
// window.location = '/';
});
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>로그인</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post" action="/api/v1/users">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<button type="button" class="btn btn-primary" onclick="login();">로그인</button>
</form>
</div>
</div>
</div>
</body>
</html>
======================
192.168.1.65:5000/login
miero
1234
jquery cookie cdn 검색
https://cdnjs.com/libraries/jquery-cookie
jquery-cookie - Libraries - cdnjs - The #1 free and open source CDN built to make life easier for developers
A simple, lightweight jQuery plugin for reading, writing and deleting cookies. - Simple. Fast. Reliable. Content delivery at its finest. cdnjs is a free and open-source CDN service trusted by over 12.5% of all websites, serving over 200 billion requests ea
cdnjs.com
templates>login.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js" integrity="sha512-aUhL2xOCrpLEuGD5f6tgHbLYEXRpYZ8G5yD+WlFrXrPy2IrWBlu6bih5C9H6qGsgqnU6mgx6KtU8TreHpASprw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
function login() {
$.ajax ({
url: '/auth',
contentType: 'application/json',
method: 'POST',
data: JSON.stringify({
username: $('#userid').val(),
password: $('#password').val(),
})
}).done(function (res) {
$.cookie('access_token', res.access_token);
});
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>로그인</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post" action="/api/v1/users">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<button type="button" class="btn btn-primary" onclick="login();">로그인</button>
</form>
</div>
</div>
</div>
</body>
</html>
======================
192.168.1.65:5000/login
miero
1234
Ctrl + Shift +i
Application
Cookies
http://192.168.1.65:5000
access_token
정상적으로 받아옴
git add .
git commit -m "jQuery와 JWT - 05. Flask-JWT를 이용한 인증 시스템 만들기"
git push origin master
Chapter 11. 기능만들기 - 01. 로그인, 로그아웃 만들기
templates>home.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js" integrity="sha512-aUhL2xOCrpLEuGD5f6tgHbLYEXRpYZ8G5yD+WlFrXrPy2IrWBlu6bih5C9H6qGsgqnU6mgx6KtU8TreHpASprw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
$(document).ready(function () {
$.ajax ({
url: '/api/v1/users',
contentType: 'application/json',
method: 'GET',
}).done(function (res) {
console.log(res);
});
});
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>메인</h1>
</div>
<div class="row mt-5">
</div>
</div>
</body>
</html>
======================
app.py--------------------
import os
from flask import Flask
from flask_jwt import JWT
from flask import render_template
from models import Fcuser, db
from api_v1 import api as api_v1
app = Flask(__name__)
app.register_blueprint(api_v1, url_prefix='/api/v1')
@app.route('/register')
def register():
return render_template('register.html')
@app.route('/login')
def login():
return render_template('login.html')
@app.route('/')
def hello():
return render_template('home.html')
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
db.init_app(app)
db.app = app
db.create_all()
def authenticate(username, password):
user = Fcuser.query.filter(Fcuser.userid == username).first()
if user.password == password:
return user
jwt = JWT(app, authenticate)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
======================
인증받은 사용자와 안받은 사용자 화면 분리
api_v1>user.py--------------------
from flask import jsonify
from flask import request
from flask_jwt import jwt_required
from models import Fcuser, db
from . import api
@api.route('/users', methods=['GET','POST'])
@jwt_required()
def users():
if request.method == 'POST':
data = request.get_json()
userid = data.get('userid')
username = data.get('username')
password = data.get('password')
re_password = data.get('re-password')
if not (userid and username and password and re_password):
return jsonify({'error': 'No arguments'}), 400
if password != re_password:
return jsonify({'error': 'Wrong password'}), 400
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return jsonify(), 201
users = Fcuser.query.all()
return jsonify([user.serialize for user in users])
@api.route('/users/<uid>', methods=['GET', 'PUT', 'DELETE'])
def user_detail(uid):
if request.method == 'GET':
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
elif request.method == "DELETE":
Fcuser.query.delete(Fcuser.id == uid)
return jsonify(), 204
data = request.get_json()
Fcuser.query.filter(Fcuser.id == uid).update(data)
user = Fcuser.query.filter(Fcuser.id == uid).first()
return jsonify(user.serialize)
======================
192.168.1.65:5000/
401 에러 - 인증받지 않았다
templates>home.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js" integrity="sha512-aUhL2xOCrpLEuGD5f6tgHbLYEXRpYZ8G5yD+WlFrXrPy2IrWBlu6bih5C9H6qGsgqnU6mgx6KtU8TreHpASprw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
$(document).ready(function () {
$.ajax ({
url: '/api/v1/users',
contentType: 'application/json',
method: 'GET',
beforeSend: function(xhr){
xhr.setRequestHeader('Authorization', 'JWT ' + $.cookie('access_token'))
}
}).done(function (res) {
console.log(res);
});
});
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>메인</h1>
</div>
<div class="row mt-5">
</div>
</div>
</body>
</html>
======================
app.py--------------------
import os
from flask import Flask
from flask_jwt import JWT
from flask import render_template
from models import Fcuser, db
from api_v1 import api as api_v1
app = Flask(__name__)
app.register_blueprint(api_v1, url_prefix='/api/v1')
@app.route('/register')
def register():
return render_template('register.html')
@app.route('/login')
def login():
return render_template('login.html')
@app.route('/')
def hello():
return render_template('home.html')
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
db.init_app(app)
db.app = app
db.create_all()
def authenticate(username, password):
user = Fcuser.query.filter(Fcuser.userid == username).first()
if user.password == password:
return user
def identity(payload):
userid = payload['identity']
return Fcuser.query.filter(Fcuser.id == userid).first()
jwt = JWT(app, authenticate, identity)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
======================
개선
templates>login.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js" integrity="sha512-aUhL2xOCrpLEuGD5f6tgHbLYEXRpYZ8G5yD+WlFrXrPy2IrWBlu6bih5C9H6qGsgqnU6mgx6KtU8TreHpASprw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
function login() {
$.ajax ({
url: '/auth',
contentType: 'application/json',
method: 'POST',
data: JSON.stringify({
username: $('#userid').val(),
password: $('#password').val(),
})
}).done(function (res) {
$.cookie('access_token', res.access_token);
window.location = '/';
});
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>로그인</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="post" action="/api/v1/users">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password">
</div>
<button type="button" class="btn btn-primary" onclick="login();">로그인</button>
</form>
</div>
</div>
</div>
</body>
</html>
======================
templates>home.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js" integrity="sha512-aUhL2xOCrpLEuGD5f6tgHbLYEXRpYZ8G5yD+WlFrXrPy2IrWBlu6bih5C9H6qGsgqnU6mgx6KtU8TreHpASprw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
$(document).ready(function () {
$.ajax ({
url: '/api/v1/users',
contentType: 'application/json',
method: 'GET',
beforeSend: function(xhr){
xhr.setRequestHeader('Authorization', 'JWT ' + $.cookie('access_token'))
}
}).done(function (res) {
$("#content").text(res);
}).error(function (res){
window.location = '/login';
});
});
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>메인</h1>
</div>
<div class="row mt-5" id="content">
</div>
</div>
</body>
</html>
======================
192.168.1.65:5000/login
miero
1234
메인
[object Object],[object Object],[object Object],[object Object]
로그아웃 만들기
토큰 삭제하면 끝이다
templates>home.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js" integrity="sha512-aUhL2xOCrpLEuGD5f6tgHbLYEXRpYZ8G5yD+WlFrXrPy2IrWBlu6bih5C9H6qGsgqnU6mgx6KtU8TreHpASprw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
$(document).ready(function () {
$.ajax ({
url: '/api/v1/users',
contentType: 'application/json',
method: 'GET',
beforeSend: function(xhr){
xhr.setRequestHeader('Authorization', 'JWT ' + $.cookie('access_token'))
}
}).done(function (res) {
$("#content").text(res);
}).error(function (res){
window.location = '/login';
});
});
function logout() {
$.removeCookie('access_token');
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>메인</h1>
</div>
<div>
<button class="btn" onclick="logout();">로그아웃</button>
</div>
<div class="row mt-5" id="content">
</div>
</div>
</body>
</html>
======================
templates>home.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js" integrity="sha512-aUhL2xOCrpLEuGD5f6tgHbLYEXRpYZ8G5yD+WlFrXrPy2IrWBlu6bih5C9H6qGsgqnU6mgx6KtU8TreHpASprw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
$(document).ready(function () {
$.ajax ({
url: '/api/v1/users',
contentType: 'application/json',
method: 'GET',
beforeSend: function(xhr){
xhr.setRequestHeader('Authorization', 'JWT ' + $.cookie('access_token'))
}
}).done(function (res) {
$("#content").text(res);
}).error(function (res){
window.location = '/login';
});
});
function logout() {
$.removeCookie('access_token');
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>메인</h1>
</div>
<div>
<button class="btn" onclick="logout();">로그아웃</button>
</div>
<div class="row mt-5" id="content">
</div>
</div>
</body>
</html>
======================
192.168.1.65:5000/login
miero
1234
메인
로그아웃
[object Object],[object Object],[object Object],[object Object]
로그아웃
새로고침
메인
로그아웃
templates>home.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js" integrity="sha512-aUhL2xOCrpLEuGD5f6tgHbLYEXRpYZ8G5yD+WlFrXrPy2IrWBlu6bih5C9H6qGsgqnU6mgx6KtU8TreHpASprw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
$(document).ready(function () {
if($.cookie('access_token')){
$("#logout-div").show();
} else {
$("#logout-div").hide();
}
$.ajax ({
url: '/api/v1/users',
contentType: 'application/json',
method: 'GET',
beforeSend: function(xhr){
xhr.setRequestHeader('Authorization', 'JWT ' + $.cookie('access_token'))
}
}).done(function (res) {
$("#content").text(res);
}).error(function (res){
window.location = '/login';
});
});
function logout() {
$.removeCookie('access_token');
window.location = '/login';
}
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>메인</h1>
</div>
<div id="logout-div">
<button class="btn" onclick="logout();">로그아웃</button>
</div>
<div class="row mt-5" id="content">
</div>
</div>
</body>
</html>
======================
192.168.1.65:5000/login
miero
1234
메인
로그아웃
[object Object],[object Object],[object Object],[object Object]
로그아웃
로그인페이지
git add .
git commit -m "기능 만들기 - 로그인, 로그아웃 만들기"
git push origin master
Chapter 12. 배포하기 - 01. pythonanywhere 배포하기
https://www.pythonanywhere.com/user/miero/
Login: PythonAnywhere
It's always a pleasure to hear from you! Ask us a question, or tell us what you love or hate about PythonAnywhere. We'll get back to you over email ASAP. Sorry, there was an error connecting to the server. Please try again in a few moments... Sorry, we hav
www.pythonanywhere.com
file
upload a file
압축파일 올리고
open bash console here
unzip fastcampus.zip -d project
virtualenv --python=python3.9 flask_env
source ./flask_env/bin/activate
pip install flask flask-wtf flask-sqlalchemy flask-jwt
exit
dashboard
web
add a new web app
next
/var/www/miero_pythonanywhere_com_wsgi.py----------
# This file contains the WSGI configuration required to serve up your
# web application at http://miero.pythonanywhere.com/
# It works by setting the variable 'application' to a WSGI handler of some
# description.
#
# +++++++++++ GENERAL DEBUGGING TIPS +++++++++++
# getting imports and sys.path right can be fiddly!
# We've tried to collect some general tips here:
# https://help.pythonanywhere.com/pages/DebuggingImportError
# +++++++++++ HELLO WORLD +++++++++++
# A little pure-wsgi hello world we've cooked up, just
# to prove everything works. You should delete this
# code to get your own working.
# HELLO_WORLD = """<html>
# <head>
# <title>PythonAnywhere hosted web application</title>
# </head>
# <body>
# <h1>Hello, World!</h1>
# <p>
# This is the default welcome page for a
# <a href="https://www.pythonanywhere.com/">PythonAnywhere</a>
# hosted web application.
# </p>
# <p>
# Find out more about how to configure your own web application
# by visiting the <a href="https://www.pythonanywhere.com/web_app_setup/">web app setup</a> page
# </p>
# </body>
# </html>"""
# def application(environ, start_response):
# if environ.get('PATH_INFO') == '/':
# status = '200 OK'
# content = HELLO_WORLD
# else:
# status = '404 NOT FOUND'
# content = 'Page not found.'
# response_headers = [('Content-Type', 'text/html'), ('Content-Length', str(len(content)))]
# start_response(status, response_headers)
# yield content.encode('utf8')
# Below are templates for Django and Flask. You should update the file
# appropriately for the web framework you're using, and then
# click the 'Reload /yourdomain.com/' button on the 'Web' tab to make your site
# live.
# +++++++++++ VIRTUALENV +++++++++++
# If you want to use a virtualenv, set its path on the web app setup tab.
# Then come back here and import your application object as per the
# instructions below
# +++++++++++ CUSTOM WSGI +++++++++++
# If you have a WSGI file that you want to serve using PythonAnywhere, perhaps
# in your home directory under version control, then use something like this:
#
#import sys
#
#path = '/home/miero/path/to/my/app
#if path not in sys.path:
# sys.path.append(path)
#
#from my_wsgi_file import application # noqa
# +++++++++++ DJANGO +++++++++++
# To use your own django app use code like this:
#import os
#import sys
#
## assuming your django settings file is at '/home/miero/mysite/mysite/settings.py'
## and your manage.py is is at '/home/miero/mysite/manage.py'
#path = '/home/miero/mysite'
#if path not in sys.path:
# sys.path.append(path)
#
#os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
#
## then:
#from django.core.wsgi import get_wsgi_application
#application = get_wsgi_application()
# +++++++++++ FLASK +++++++++++
# Flask works like any other WSGI-compatible framework, we just need
# to import the application. Often Flask apps are called "app" so we
# may need to rename it during the import:
#
#
import sys
# The "/home/miero" below specifies your home
# directory -- the rest should be the directory you uploaded your Flask
# code to underneath the home directory. So if you just ran
# "git clone git@github.com/myusername/myproject.git"
# ...or uploaded files to the directory "myproject", then you should
# specify "/home/miero/myproject"
path = '/home/miero/project'
if path not in sys.path:
sys.path.append(path)
from app import app as application # noqa
#
# NB -- many Flask guides suggest you use a file called run.py; that's
# not necessary on PythonAnywhere. And you should make sure your code
# does *not* invoke the flask development server with app.run(), as it
# will prevent your wsgi file from working.
==========
manual configuration
python3.9
next
code
Source code:
/home/miero/project
잘못했을때
rm -rf flak_env
miero_pythonanywhere_com_wsgi.py--------------------
import sys
# The "/home/miero" below specifies your home
# directory -- the rest should be the directory you uploaded your Flask
# code to underneath the home directory. So if you just ran
# "git clone git@github.com/myusername/myproject.git"
# ...or uploaded files to the directory "myproject", then you should
# specify "/home/miero/myproject"
path = '/home/miero/fastcampus'
if path not in sys.path:
sys.path.append(path)
from app import app as application # noqa
====================
web
virtualenv:
Reload miero.pythonanywhere.com
miero.pythonanywhere.com
'컴퓨터 > Python' 카테고리의 다른 글
jupyterlab 설치 에러 (0) | 2022.04.15 |
---|---|
flask slack (0) | 2022.04.08 |
flask git (0) | 2022.03.23 |
python ticket.interpark (0) | 2022.02.18 |
python 엑셀사용하기 업무의잔머리 (0) | 2021.08.21 |