FullStack 기반

과정 소개


python을 사용하여 데이터 드라이브를 만드는 웹 응용 프로그램을 배울 것입니다.웹 응용 프로그램은 이 두 구성 요소를 배울 것입니다.프런트엔드와 백엔드.
간단한 다중 사용자 블로그 응용 프로그램을 구축할 것입니다.보아하니

이 과정은udacityFullStack Foundations과정에서 선택되었습니다.
그림은 dev.topost에서 촬영되었습니다.

요구 사항

  • 유랑자(예)
  • 지트
  • 구렁이x
  • pipenv
  • Vagrant는 가상 시스템을 구성하고 호스트와 가상 시스템 파일 시스템 간에 파일을 공유할 수 있도록 하는 소프트웨어입니다.
    here에서 vagrant box를 다운로드하여 vagrant 환경으로 가져옵니다.
    vagrant box add --name fullstack_foundations /path/to/file
    
    이제 부랑자 상자 시작
    vagrant init fullstack_foundations
    vagrant up
    vagrant ssh
    

    묵은 때를 쓰다


    네, 그럼 블로그 응용 프로그램에서 무엇을 할 거예요?게시물을 작성, 읽기, 업데이트 및 삭제합니다.요컨대 그것은 묵은 때라고 불린다.
    미디어를 등록하거나 업로드하거나 게시물을 작성할 때 데이터베이스에서 나중에 검색할 수 있도록 데이터를 "만들기"합니다.다른 사람 또는 사용자의 개인 정보에서 데이터를 보는 것은 읽기 데이터로 간주됩니다.이와 유사하게 데이터베이스에 있는 기존 데이터 항목을 편집할 때 이를'업데이트'라고 부른다.데이터베이스에서 같은 정보를 삭제하는 것을'삭제'라고 부른다
    CRUD는 사용자가 웹에서 수행하는 모든 작업을 패키지화합니다.
    데이터베이스는 모든 CRUD 작업에 영구적으로 저장됩니다.즉, 서버가 종료되더라도 서버를 재부팅한 후 동일한 CRUD 작업을 수행할 수 있습니다.SQL은 데이터베이스와 상호작용하는 유행어로 DBMS(데이터베이스 관리 시스템, 모든 작업을 영구적으로 저장하는 시스템)가 완성한 모든 밑바닥 작업을 봉인한다.
    SQL에는 CRU와 관련된 주요 쿼리 4개가 있습니다.
    INSERT INTO `users` (`username`, `name`) VALUES ('user101', 'Ankit'); -- creating data
    SELECT * FROM `users`;                                                -- reading data
    UPDATE `users` SET `name`='Anuj' WHERE `username`='user101';          -- updating data
    DELETE FROM `users` WHERE `username`='user101';                       -- deleting data
    
    ORM(객체 관계 매핑기)은 복잡하고 무서운 모든 SQL 질의를 봉인할 수 있는 프레임워크입니다.이것은 SQL 작업을python 클래스에 비추어 개발자들이 업무 논리에 더욱 관심을 가지게 하여 이러한 조회와 잠재적인 빈틈을 걱정한다.이 과정에서 저는 유행하는 ORM을 사용할 것입니다.SQLAlchemy
    pip를 사용하여 SQLAchemy 설치
    pip install --user sqlalchemy
    
    클래스가 sqlalchemy를 통해 sql와 상호작용할 수 있도록 sqlalchemy를 계승해야 합니다 declarative base class
    from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta
    Base: DeclarativeMeta = declarative_base()
    
    클래스는 __tablename__ 데이터 변수를 가지고 있어야 합니다. 이 변수는 sqlalchemy 클래스가 데이터베이스에 대응하는 표를 알려 줍니다.그리고 클래스를 정의한 후에 create_all 방법으로 표를 만들어야 합니다. 이 방법은 engine 파라미터를 사용합니다.
    Base.metadata.create_all(engine)
    
    클래스를 정의하기 전에 엔진을 만들어야 합니다
    from sqlalchemy.engine import create_engine, Engine
    engine: Engine = create_engine("sqlite:///blogs.db")
    
    엔진의 첫 번째 부분(sqlite:///을 방언이라고 하는데 이것은 데이터베이스 제공 프로그램의 유형이다.이것은 sqlite, mysql, mssql,postgres와 많은 다른 sql 제공 프로그램일 수 있습니다.
    우리의 예에서users류는 보기에
    class User(Base):
        __tablename__ = "users"
    
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(100))
        uname = Column(String(10), nullable=False)
        passwd = Column(String(20), nullable=False)
        pass
    
    데이터베이스 커서를 가져오려면 마지막 일 sessionmaker 이 필요합니다.그것 없이는 데이터베이스에 대해 조작할 수 없습니다
    from sqlalchemy.orm.session import Session, sessionmaker
    DBSession = sessionmaker(engine)
    session: Session = DBSession()
    
    모든 설정이 완료되면 세션을 사용하여 사용자 코드 3줄만 생성합니다
    user = User(name='Anuj', uaername='anuj', password='anuj101')
    session.add(user)
    session.commit()
    
    지금까지 데이터베이스에 연결하고 기록을 만드는 방법을 배웠습니다.지금은 데이터베이스에서 실제로 읽을 때다.모든 사용자를 열거하려면 코드가 매우 비슷하다
    users = session.query(User).all()
    
    이것은 모든 사용자의 목록을 제공합니다(List[User].첫 번째 결과를 얻으려면 .first() 방법을 사용해야 한다
    user = session.query(User).first()
    
    그러면 User 유형의 객체가 제공됩니다.따라서 session.query(User) 객체가 반환됩니다.링크에서 다른 모든 방법을 볼 수 있습니다.
    sqlalchemy 업데이트 항목을 사용하는 것은 매우 쉽습니다. 먼저 대상을 얻고 속성을 업데이트한 다음에 세션에 추가하고 제출해야 합니다.
    user = session.query(User).first()
    user.name = 'My New Name'
    session.add(user)
    session.commit()
    
    데이터베이스에서 일치하는 항목이 업데이트됩니다.
    항목을 삭제하는 것은 상기 코드와 유사하지만, 세션 대상이 아닌 .delete() 을 사용해야 합니다.
    user = session.query(User).first()
    session.delete(user)
    session.commit()
    

    조회 웹 서버 만들기


    인터넷 세계에서 당신은 두 단어를 자주 들을 수 있다.클라이언트와 서버.클라이언트와 서버는 인터넷을 통해 서로 통신하는 컴퓨터 장치다.
    클라이언트는 일반적으로 서버에 요청을 하고 서버가 이 요청을 처리하여 응답을 클라이언트에게 보내는 클라이언트입니다.
    클라이언트와 서버가 같은 언어를 사용하도록 하기 위해서, 프로토콜은 일종의 규칙으로, 일부 형식/방식을 강제적으로 실행하여 서버/클라이언트와 통신하게 하며, 혼동이 발생하지 않도록 한다.HTTP는 웹 프로토콜입니다.
    HTTP는 TCP/IP 프로토콜을 사용하여 더 나은 통신을 수행합니다.HTTP는 하이퍼텍스트 전송 프로토콜, TCP는 연결된 채널을 위한 전송 제어 프로토콜, IP는 단말기를 식별하고 포지셔닝하는 인터넷 프로토콜을 나타낸다.
    브라우저가 요청한 상태를 이해하기 위해 서버는 세 자리 숫자를 되돌려줍니다. 응답을 상태 코드라고 합니다.흔히 볼 수 있는 상태 코드가 있다.
    200 - OK
    201 - Created
    401 - Unauthorized
    404 - Not Found
    502 - Bad Gateway
    503 - Internal Server Error
    
    요청을 구분하기 위해 클라이언트는 HTTP 동사를 보냅니다.9개의 HTTP 동사가 있지만 그 중 2개가 가장 흔하다.가져오고 게시합니다.GET 는 기존 리소스를 요청하는 데 사용되며 이 리소스를 찾을 수 없으면 서버에서 HTTP 404를 반환합니다.POST는 데이터베이스에서 리소스를 만들거나 업데이트하는 데 사용됩니다.
    이 섹션에서는 .add() 패키지를 사용하여 웹 서버를 만드는 방법을 학습합니다.그래서 간단한 Hello 월드 서버가 닮았어요.
    from http.server import BaseHTTPRequestHandler, HTTPServer
    
    
    class RequestHandler(BaseHTTPRequestHandler):
        # overriding do_GET method
        def do_GET(self):
            try:
                # the request path
                if self.path.endswith("/hello"):
                    self.send_response(200)  # sending status code
                    self.send_header("Content-Type",
                                     "text/html; charset=utf-8")  # sending header
                    # ending header, this will let browsers know that after this there is response body
                    self.end_headers()
    
                    # sending http response body
                    body = "<html><body><h1>Hello World!</h1></body></html>"
                    self.wfile.write(body.encode())
                else:
                    self.send_response(404)
                    self.send_header("Content-Type", "text/plain; charset=utf-8")
                    self.end_headers()
    
                    body = "Resource Not Found"
                    self.wfile.write(body.encode())
            except IOError:
                # error handling
                self.send_error(503, "Internal Server Error")
                pass
            pass
    
        pass
    
    
    def run(host='0.0.0.0', port=5000, requestHandler=RequestHandler):
        try:
            # creating instance of HTTP server and binding to host and port with request handler
            httpd = HTTPServer((host, port), requestHandler)
            print("Press ^C to Exit")
    
            # starting server
            httpd.serve_forever()
        except KeyboardInterrupt:
            print("\rStopping")
            httpd.shutdown()  # stopping server of pressing CTRL C
    
    
    if __name__ == "__main__":
        run()
    
    나는 http.server 클래스에서 계승 BaseHTTPRequestHandler 하고 함수 RequestHandler 를 확장하여 모든 GET 요청을 처리합니다.do_GET 방법으로 POST 요청을 처리하려면 다음과 같이 하십시오.
    def do_POST(self):
        file: BufferedReader = self.rfile  # body
    
        # reading header file
        ctype = self.headers.get("content-type")
        clen = self.headers.get("content-length")
    
        # parsing to dict from string
        if ctype == "application/json":
            body = json.loads(file.read(int(clen)).decode())
        else:
            return self.send_error(503, "Accepts only JSON data")
    
        # sending response
        self.send_response(200)
        self.send_header("Content-Type", "application/json")
        self.end_headers()
    
        data = {"success": True, "body": body}
        body = json.dumps(data)
        self.wfile.write(body.encode())
    
    이 경우 POST 메서드는 수락만 가능합니다do_POST.서버 처리 요청을 만드는 데 시간이 많이 걸리기 때문에 개발자로서 언어가 아닌 제품에 더 관심을 가져야 한다는 것을 보았습니다.따라서 다음 절에서 백엔드 서버 프레임워크를 볼 수 있습니다. 백엔드에서 이 모든 문제를 처리할 것입니다.

    HTTP 서버 프레임워크 사용


    프레임워크는 개발자의 도구로 모든 자질구레한 중복 코드를 처리함으로써 개발 과정을 간소화하고 응용 프로그램에 전념할 수 있습니다.
    이 테마에서flask 프레임워크를 사용하여 웹 응용 프로그램을 구축할 것입니다.플라스크를 설치하다
    pip install flask
    
    flask에서 같은 Hello World 프로그램을 만듭니다.
    from flask import Flask
    
    # creating flask app
    app = Flask(__name__)
    
    # handling routes
    @app.route("/")
    @app.route("/hello")
    def hello_world():
        # by default sends html response
        return "Hello World"
    
    
    if __name__ == "__main__":
        # running server
        app.run(debug=True, host='0.0.0.0', port=5000)
    
    봤어!짧은 15줄에서 우리는 Hello World 웹 서버를 덮어썼다.이것은 당신이 프레임을 사용할 때 느낄 수 있는 힘입니다.
    라우팅은 서버에서 자원을 유일하게 식별하는 데 도움이 되고, 세그먼트 플러그인을 지우면 클라이언트와 사용자가 응용 프로그램의 URL을 기억하는 데 도움이 된다.예를 들어 이 URLapplication/json을 통해 모든 사람들이 클라이언트가 서버에서 블로그를 보내고자 하는 상세한 정보를 쉽게 발견할 수 있다
    따라서 동적 라우팅을 만들려면 이러한 자리 표시자를 추가해야 합니다.
    @app.route('/post/<int:id>')
    def get_post_by_id(id):
        pass
    
    이것은 /post/1 형식의 id 을 되돌려줍니다. 나중에 함수에서 사용할 수 있습니다.
    기본적으로 int GET 메서드를 수신하므로 POST 메서드를 추가하려면 @app.route 를 포함해야 합니다.그러나 이는 POST 방법에만 적용됩니다.
    @app.route("/post", methods=['POST']
    def save_post():
        pass
    
    응용 프로그램이 갈수록 복잡해지면서 함수 자체에서 HTML 응답을 만드는 것은 매우 복잡해지고 결국 오류가 남게 됩니다.이 문제를 해결하기 위해flask는 html 페이지의 템플릿화를 지원합니다. 템플릿을 확장해서 실행 중에 보여 줍니다.플라스크는 템플릿 엔진 으로 사용된다.템플릿 자체에 유사한flask 함수를 포함할 수 있습니다.
    기본적으로flask 응용 프로그램 입구점의 현재 디렉터리에서flask가 사용하는 템플릿 폴더는 methods=['POST']더욱 개성화된 사용자 체험을 만들려면 jinja 을 사용하십시오.세션을 사용하면 서버에서 클라이언트에 대한 정보를 저장하고 그에 따라 상세한 정보를 얻을 수 있습니다.세션을 사용하기 위해서flask는 데이터 암호화에 사용할 키가 필요합니다.
    app.secret_key = 'some random key'
    
    사용자는 상호작용에 대한 경보를 보아야 합니다. 이를 위해flask url_for 를 사용할 것입니다.
    flash 메시지 설정
    flash("Your message")
    
    템플릿에서 flask 메시지 가져오기
    {% with messages = get_flashed_messages() %}
      {% if messages %}
        <ul>
        {% for message in messages %}
          <li>{{ message }}</li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}
    
    프로젝트의 데이터 파일은 templates 폴더에 있습니다.ssh에 로그인하면vagrant의 가상 env는 이미 출처를 얻습니다.마스터 서버는 sessionsflash 에 의존합니다.과정 프레젠테이션의 다른 서버 파일도 같은 디렉터리에 있습니다

    프로그램 교체 개발


    응, 직접 개발에 들어가는 것이 더 빠른 방법인 것 같지만, 결국 너는 너무 많은 버그에 직면하게 될 거야.
    이 문제를 극복하기 위해서는 각각의 특성을 하나하나 개발하고 하나의 특성(개발과 테스트)을 완성한 후에 다른 특성층에 추가해야 합니다.이렇게 하면 고객은 프로젝트의 전체 상태를 이해하고 작업 절차가 잘 조직될 것입니다
    이를 위해 응용 프로그램의 대략적인 모델을 간단하게 수동으로 만들고 사용자 흐름의 각 점을 연결할 수 있습니다.이렇게 하면 응용 프로그램의 테두리라고 불리는 것을 얻을 수 있고 청사진이라고도 부른다.그리고 당신이 개발을 시작할 때, 당신은 무엇을 먼저 완성하고 어떻게 완성할 것인가.

    연락 주세요.


    링크를 클릭하여 연락 주세요.
  • 이메일:
  • 트위터:
  • 페이스북: [email protected]
  • GitHub:@tbhaxor
  • LinkedIn:
  • Instagram:
  • 좋은 웹페이지 즐겨찾기