flask로 당신의 첫 번째 사이트를 만듭니다!

이 강좌에서, 우리는 Python Flask와 MySQL을 사용하여 완전한 로그인과 등록 시스템을 만들 것이다.
파이톤은 현재 웹 개발 분야에서 붐을 일으키며 매년 지속적으로 성장하고 있다.파이톤을 사용하기 시작하는 것은 쉬울 뿐만 아니라, 그렇게 많은 의존항을 단독으로 다운로드할 필요가 없다.
이 프로젝트를 시작하기 위해서, 우리는 우리의 프로젝트에 필요한 소프트웨어 패키지를 설정할 것이다.
mkdir flaskproject
위의 명령을 사용하여 프로젝트 파일을 저장할 프로젝트 디렉터리를 만듭니다.
그리고 이 디렉터리로 이동해서python 프로젝트 파일을 만듭니다.
프로젝트를 위한 디렉토리로 이동
cd flaskproject
우리python 프로젝트 만들기
touch flaskweb.py
html 파일을 저장하기 위해templates라는 폴더를 만들고 css 파일을 저장하기 위해static라는 파일을 만들 것입니다.
우리는 이곳에서 html 파일을 만들 것이다
mkdir templates
css 파일을 만들 것입니다
mkdir static
그리고 flask 프로젝트 폴더에 가상 환경을 설치할 것입니다.Python 가상 환경은 Python과 관련 pip 패키지의 버전을 결합하고 분리하는 데 도움이 됩니다.따라서 엔드 유저가 시스템에 독립적으로 제공하는 패키지 세트를 설치하고 관리할 수 있습니다.명령 프롬프트에서 다음 명령을 실행합니다.
pip install virtualenv
그리고 우리는 우리의 프로젝트를 위해 가상 환경을 만들 것이다.
virtualenv dev
그런 다음 가상 환경을 시작하겠습니다.
source dev/Scripts/activate
flask를 사용할 수 있도록 프로젝트에 설치해야 합니다.명령 프롬프트에서 pip를 사용하여 flask를 설치합니다.
pip install flask
우리는 지금 이 프로젝트를 시작할 준비를 하고 있다.좋아하는 IDE에서 항목을 엽니다.나로서는 vscode를 좋아한다.명령 알림부호 아래에서 내 항목을 열 것을 추가합니다. 다음 명령을 실행할 수 있습니다.
code flaskweb.py
그리고 우리는 매우 기본적인flask 프로그램을 구축하여 모든 것이 정상인지 테스트합니다.
from flask import  Flask

app = Flask(__name__)

@app.route("/")
def regiter():

    return <h1>my first flask project</h1>


if __name__ == "__main__":
    app.run(debug=True)

만일 모든 것이 완벽하다면 html과 css 파일을 만듭니다.템플릿 폴더로 이동하여 로그인을 생성하고 생성합니다.html 레이아웃.html과 홈.html 파일.그리고 정적 폴더를 열고 '스타일' 이라는 파일을 만듭니다.css'.주의: vscode에서 폴더를 열고 파일을 추가할 수 있습니다.
Your folder should look like this
그리고 루트가 있는 함수를 만들고 html 파일을 보여 드리겠습니다.
from flask import Flask, render_template, request, url_for, session

app = Flask(__name__)

@app.route("/")
def home():
    #our code will co here
    return render_template('home.html')

@app.route("/login")
def login():
    #our code will co here
    return render_template('login.html')

@app.route("/logout")
def logout():
    #our code will co here
    return redirect(url_for('login'))

@app.route("/register")
def register():
    #our code will co here
    return redirect('register.html')


if __name__ == "__main__":
    app.run(debug=True)

우리는 현재 html과 css를 사용하여 우리의 웹 페이지를 설계할 것이다.우리는 우선 레이아웃 페이지를 만들 것이다. 이 페이지는 모든 html 파일의 유사한 내용을 저장하여 군더더기를 줄일 것이다.
<!DOCTYPE html>
<html>
    <head>

         {% block title %}
        <!-- we are using jinja templates to create a block where code from other html files will be passed-->
        {% endblock title %}

        <link rel="stylesheet" href="{{url_for('static', filename='login.css')}}">
    </head>


    <body>
    {% block body%}


    {%endblock body%}
    </body>
</html>

그리고 우리는 로그인을 만들고 로그인에 폼을 등록할 것입니다.html 파일.
{% extends 'layout.html' %}
{% block title%}
<title>
   {%if title%} 
        {{title}}
    {% else%}
        login
    {% endif %}
    </title>




{%endblock title%}

{% block body%}
<div class="login-wrap">
    <div class="login-html">
        <input id="tab-1" type="radio" name="tab" class="sign-in" checked><label for="tab-1" class="tab">Sign In</label>
        <input id="tab-2" type="radio" name="tab" class="sign-up"><label for="tab-2" class="tab">Sign Up</label>
        <div class="login-form">
            <div class="sign-in-htm">


                <form action="{{ url_for('login') }}" method="post" >
                    <div class="group">
                        <label for="user" class="label">Username</label>
                        <input id="user" type="text" class="input" name="Username">
                    </div>
                    <div class="group">
                        <label for="pass" class="label">Password</label>
                        <input id="pass" type="password" class="input" data-type="password" name="password">
                    </div>
                    <div class="group">
                        <input id="check" type="checkbox" class="check" checked>
                        <label for="check"><span class="icon"></span> Keep me Signed in</label>
                    </div>
                    <div class="msg">{{ msg }}</div>
                    <div class="group">
                        <input type="submit" class="button" value="Sign In">
                    </div>
                </form>


                <div class="hr"></div>
                <div class="foot-lnk">
                    <a href="#forgot">Forgot Password?</a>
                </div>
            </div>
            <div class="sign-up-htm">


            <form action="{{ url_for('register') }}" method="post">
                    <div class="group">
                        <label for="user" class="label" name="username">Username</label>
                        <input id="user" type="text" class="input">
                    </div>
                    <div class="group">
                        <label for="pass" class="label" name="password">Password</label>
                        <input id="pass" type="password" class="input" data-type="password">
                    </div>
                    <div class="group">
                        <label for="pass" class="label" name="retry_password">Repeat Password</label>
                        <input id="pass" type="password" class="input" data-type="password">
                    </div>
                    <div class="group">
                        <label for="pass" class="label" name="email">Email Address</label>
                        <input id="pass" type="text" class="input">
                    </div>
                    <div class="msg">{{ msg }}</div>
                    <div class="group">
                        <input type="submit" class="button" value="Sign Up">
                    </div>
            </form>


                <div class="hr"></div>
                <div class="foot-lnk">
                    <label for="tab-1">Already Member?</a>
                </div>
            </div>
        </div>
    </div>



</div>

{%endblock body%}
그리고 우리는 우리의 홈페이지를 만들 것이다.
{% extends 'layout.html' %}
{% block title%}
<title>
   {%if title%} 
        {{title}}
    {% else%}
        home
    {% endif %}
    </title>
{%endblock title%}

{% block body%}

<h2>Home Page</h2>
<p>Welcome back, {{ username }}!</p>

{%endblock body%}
우리는 우리의 풍격에 내용을 추가할 것이다.정적 폴더의 css 파일입니다.
body{
    margin:0;
    background:url(../images/loginbackground.jpg) no-repeat center;
    font:600 16px/18px 'Open Sans',sans-serif;
    padding: 0;
}
*,:after,:before{box-sizing:border-box}
.clearfix:after,.clearfix:before{content:'';display:table}
.clearfix:after{clear:both;display:block}
a{color:inherit;text-decoration:none}

.login-wrap{
    width:100%;
    margin:auto;
    max-width:525px;
    min-height:670px;
    position:relative;
    background:url(https://raw.githubusercontent.com/khadkamhn/day-01-login-form/master/img/bg.jpg) no-repeat center;
    box-shadow:0 12px 15px 0 rgba(0,0,0,.24),0 17px 50px 0 rgba(0,0,0,.19);
}
.login-html{
    width:100%;
    height:100%;
    position:absolute;
    padding:90px 70px 50px 70px;
    background:rgba(40,57,101,.9);
}
.login-html .sign-in-htm,
.login-html .sign-up-htm{
    top:0;
    left:0;
    right:0;
    bottom:0;
    position:absolute;
    transform:rotateY(180deg);
    backface-visibility:hidden;
    transition:all .4s linear;
}
.login-html .sign-in,
.login-html .sign-up,
.login-form .group .check{
    display:none;
}
.login-html .tab,
.login-form .group .label,
.login-form .group .button{
    text-transform:uppercase;
}
.login-html .tab{
    font-size:22px;
    margin-right:15px;
    padding-bottom:5px;
    margin:0 15px 10px 0;
    display:inline-block;
    border-bottom:2px solid transparent;
}
.login-html .sign-in:checked + .tab,
.login-html .sign-up:checked + .tab{
    color:#fff;
    border-color:#1161ee;
}
.login-form{
    min-height:345px;
    position:relative;
    perspective:1000px;
    transform-style:preserve-3d;
}
.login-form .group{
    margin-bottom:15px;
}
.login-form .group .label,
.login-form .group .input,
.login-form .group .button{
    width:100%;
    color:#fff;
    display:block;
}
.login-form .group .input,
.login-form .group .button{
    border:none;
    padding:15px 20px;
    border-radius:25px;
    background:rgba(255,255,255,.1);
}
.login-form .group input[data-type="password"]{
    text-decoration:circle;
    -webkit-text-security:circle;
}
.login-form .group .label{
    color:#aaa;
    font-size:12px;
}
.login-form .group .button{
    background:#1161ee;
}
.login-form .group label .icon{
    width:15px;
    height:15px;
    border-radius:2px;
    position:relative;
    display:inline-block;
    background:rgba(255,255,255,.1);
}
.login-form .group label .icon:before,
.login-form .group label .icon:after{
    content:'';
    width:10px;
    height:2px;
    background:#fff;
    position:absolute;
    transition:all .2s ease-in-out 0s;
}
.login-form .group label .icon:before{
    left:3px;
    width:5px;
    bottom:6px;
    transform:scale(0) rotate(0);
}
.login-form .group label .icon:after{
    top:6px;
    right:0;
    transform:scale(0) rotate(0);
}
.login-form .group .check:checked + label{
    color:#fff;
}
.login-form .group .check:checked + label .icon{
    background:#1161ee;
}
.login-form .group .check:checked + label .icon:before{
    transform:scale(1) rotate(45deg);
}
.login-form .group .check:checked + label .icon:after{
    transform:scale(1) rotate(-45deg);
}
.login-html .sign-in:checked + .tab + .sign-up + .tab + .login-form .sign-in-htm{
    transform:rotate(0);
}
.login-html .sign-up:checked + .tab + .login-form .sign-up-htm{
    transform:rotate(0);
}

.hr{
    height:2px;
    margin:60px 0 50px 0;
    background:rgba(255,255,255,.2);
}
.foot-lnk{
    text-align:center;
}
현재 남은 것은 html표에서 데이터를 얻는 것이다.그러나 그 전에 우리는 응용 프로그램과 데이터베이스를 연결해야 한다.이 예에서, 우리는 mysql 데이터베이스를 사용합니다.
.
mySQL을 설정한 후 당신이 가장 좋아하는 이름으로 새 데이터베이스를 만듭니다.
그리고 다음 sql 코드를 사용하여 데이터베이스에 주어진 값을 가진 표를 만듭니다
CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(50) NOT NULL,
    `password` varchar(255) NOT NULL,
    `email` varchar(100) NOT NULL,
    PRIMARY KEY (`id`)
) ```




We will then link the database with our project. To facilatate this we have to install pymysql module that will help us in the connection. Open your command prompt and use pip to install the module.


```cmd
pip install pymysql
그리고 우리는 우리의 소병망으로 돌아갈 것이다.py 파일과 모듈을 가져옵니다.
from flask import Flask, render_template, request, url_for, session
import pymysql
이 모듈을 사용하면 데이터베이스와의 연결을 만들 것입니다.
from flask import Flask, render_template, request, url_for, session
import pymysql

pp = Flask(__name__)


# database connection details 
# Intializing MySQL
connection = pymysql.connect(host='localhost', password='', user='root', database='luxproject')

그리고 우리는post방법을 사용하여 html표에서 데이터를 검색하고 우리는post방법을 사용하여 데이터를 루트로 보낼 것이다.
@app.route("/register", methods=['POST', 'GET'])
def regiter():
    if request.method == "POST":
        username = request.form['username']
        phone = request.form['phone']
        password = request.form['password']
그 다음에 우리는 사용자가 입력한 데이터를 검사하여 우리의 표준에 부합되는지 확인하고 이를 우리의 데이터베이스에 보낼 것이다.
@app.route('/register' , methods=['GET', 'POST'])
def register():
    msg=''
    # Check if "username", "password" and "email" POST requests exist (user submitted form)
    if request.method == 'POST' and 'username' in request.form and 'password' in request.form and 'email' in request.form:
        # Create variables for easy access
        username = request.form['username']
        password = request.form['password']
        email = request.form['email']
        # Show registration form with message (if any)
        cursor = connection.cursor()
        cursor.execute('SELECT * FROM users WHERE username = {}'.format(username,))
        account = cursor.fetchone()
        # If account exists show error and validation checks
        if account:
            msg = 'Account already exists!'
        elif not re.match(r'[^@]+@[^@]+\.[^@]+', email):
            msg = 'Invalid email address!'
        elif not re.match(r'[A-Za-z0-9]+', username):
            msg = 'Username must contain only characters and numbers!'
        elif not username or not password or not email:
            msg = 'Please fill out the form!'
        else:
            # Account doesnt exists and the form data is valid, now insert new account into accounts table
            cursor.execute('INSERT INTO users VALUES (NULL, %s, %s, %s)', (username, password, email,))
            connection.commit()
            msg = 'You have successfully registered!'
    elif request.method == 'POST':
        # Form is empty... (no POST data)
        msg = 'Please fill out the form!'



    return render_template('login.html', msg=msg)
로그인 세션도 만들 것입니다.여기서 우리는 사용자의 입력을 얻어 데이터베이스에 있는 데이터와 비교할 것이다. 만약에 사용자가 존재한다면 우리는 그가 들어갈 수 있도록 허락할 것이다.
@app.route('/login', methods=['GET', 'POST'])
def login():
    msg=''
     # Check if "username" and "password" POST requests exist (user submitted form)
    if request.method == 'POST' and 'username' in request.form and 'password' in request.form:
        # Create variables for easy access
        username = request.form['username']
        password = request.form['password']
         # Check if account exists using MySQL
        cursor = connection.cursor()
        cursor.execute('SELECT * FROM users WHERE username = %s AND password = %s', (username, password,))

        # Fetch one record and return result
        account = cursor.fetchone()

     # If account exists in accounts table in out database
        if account:
            # Create session data, we can access this data in other routes
            session['loggedin'] = True
            session['id'] = account['id']
            session['username'] = account['username']
            # Redirect to home pag(
            return render_template('home.html')
        else:
            # Account doesnt exist or username/password incorrect
            msg = 'Incorrect username/password!'

    return render_template('login.html', msg=msg)
홈 페이지와 로그아웃 기능도 만들 것입니다.
가정 기능
def home():
    # Check if user is loggedin
    if 'loggedin' in session:
        # User is loggedin show them the home page
        return render_template('home.html', username=session['username'])
    # User is not loggedin redirect to login page
    return redirect(url_for('login'))
로그아웃 기능
@app.route('/pythonlogin/logout')
def logout():
    # Remove session data, this will log the user out
   session.pop('loggedin', None)
   session.pop('id', None)
   session.pop('username', None)
   # Redirect to login page
   return redirect(url_for('login'))
지금 우리 소병망.py 파일은 다음과 같아야 한다.
import re
from flask import Flask, render_template, request, url_for, session
import pymysql
from werkzeug.utils import redirect


app = Flask(__name__)


# database connection details 
# Intializing MySQL
connection = pymysql.connect(host='localhost', password='', user='root', database='luxproject')


@app.route('/')
@app.route('/home')
def home():
    # Check if user is loggedin
    if 'loggedin' in session:
        # User is loggedin show them the home page
        return render_template('home.html', username=session['username'])
    # User is not loggedin redirect to login page
    return redirect(url_for('login'))


@app.route('/login', methods=['GET', 'POST'])
def login():
    msg=''
     # Check if "username" and "password" POST requests exist (user submitted form)
    if request.method == 'POST' and 'username' in request.form and 'password' in request.form:
        # Create variables for easy access
        username = request.form['username']
        password = request.form['password']
         # Check if account exists using MySQL
        cursor = connection.cursor()
        cursor.execute('SELECT * FROM users WHERE username = %s AND password = %s', (username, password,))

        # Fetch one record and return result
        account = cursor.fetchone()

     # If account exists in accounts table in out database
        if account:
            # Create session data, we can access this data in other routes
            session['loggedin'] = True
            session['id'] = account['id']
            session['username'] = account['username']
            # Redirect to home pag(
            return render_template('home.html')
        else:
            # Account doesnt exist or username/password incorrect
            msg = 'Incorrect username/password!'

    return render_template('login.html', msg=msg)



@app.route('/pythonlogin/logout')
def logout():
    # Remove session data, this will log the user out
   session.pop('loggedin', None)
   session.pop('id', None)
   session.pop('username', None)
   # Redirect to login page
   return redirect(url_for('login'))


@app.route('/register' , methods=['GET', 'POST'])
def register():
    msg=''
    # Check if "username", "password" and "email" POST requests exist (user submitted form)
    if request.method == 'POST' and 'username' in request.form and 'password' in request.form and 'email' in request.form:
        # Create variables for easy access
        username = request.form['username']
        password = request.form['password']
        email = request.form['email']
        # Show registration form with message (if any)
        cursor = connection.cursor()
        cursor.execute('SELECT * FROM users WHERE username = {}'.format(username,))
        account = cursor.fetchone()
        # If account exists show error and validation checks
        if account:
            msg = 'Account already exists!'
        elif not re.match(r'[^@]+@[^@]+\.[^@]+', email):
            msg = 'Invalid email address!'
        elif not re.match(r'[A-Za-z0-9]+', username):
            msg = 'Username must contain only characters and numbers!'
        elif not username or not password or not email:
            msg = 'Please fill out the form!'
        else:
            # Account doesnt exists and the form data is valid, now insert new account into accounts table
            cursor.execute('INSERT INTO users VALUES (NULL, %s, %s, %s)', (username, password, email,))
            connection.commit()
            msg = 'You have successfully registered!'
    elif request.method == 'POST':
        # Form is empty... (no POST data)
        msg = 'Please fill out the form!'



    return render_template('login.html', msg=msg)


if __name__ == ('__main__'):
    app.run(debug=True)
현재 당신은 이미 첫 번째flask 사이트를 개발했습니다.흥분했어! . 손 안에 있는 물건을 마음대로 놓으세요.

좋은 웹페이지 즐겨찾기