이전에는 Django를 사용하여 작은 사이트를 구축했지만 Django가 너무 번거롭다고 느껴서 좀 더 가벼운 웹 프레임워크로 전환하여 플레이하기로 결정했습니다. Web.py 작성자가 사망하고 프로젝트가 오랫동안 업데이트되지 않아 사용하지 않을 예정입니다. Flask는 또한 성숙한 경량 웹 프레임워크입니다. github에는 많은 Stars와 Fork가 있으며 문서와 확장 기능도 매우 풍부합니다.
프레임워크를 익히는 가장 좋은 방법은 프레임워크를 활용해 프로젝트를 진행하고 실제 전투에서 프레임워크를 이해하고 익히는 것입니다. 여기서는 Flask 프레임워크와 Mysql 데이터베이스를 사용하여 포럼 시스템을 구축합니다. 참새는 작지만 모든 장기를 갖추고 있습니다.
포럼 시스템 스크린샷
다음은 기본입니다. 포럼 기능:
완전한 사용자 모듈(등록, 로그인, 변경, 비밀번호 검색, 정보 수정, 사이트 메시지 알림) 풍부한 포럼 모듈(생성, 주제에 대한 답변, 사이트 검색, 마크다운 지원, @) 사용자 알림) 강력한 배경 관리, 사용자 차단 지원, 주제, 댓글에 대한 다양한 검색 조건 지원
이 블로그에서는 일련의 기사를 사용하여 포럼 시스템 구축 과정을 기록합니다. 이제 막 웹 개발을 시작하는 학생들에게 도움이 될 것입니다.
Django, Flask 등 Python의 웹 프레임워크에 대해 자주 듣습니다. 그렇다면 프레임워크란 정확히 무엇인가요? 웹 프레임워크와 웹 서버(Nginx, Apache 등)의 차이점은 무엇일까요? 또한 프레임워크 없이 웹 사이트를 구축하려면 Python을 사용하여 웹 서버의 작동 원리와 웹 프레임워크의 특성을 이해해야 합니다.
웹 서버
브라우저에 URL을 입력하면 브라우저는 먼저 DNS 서버에 요청한 사이트의 IP 주소를 요청합니다. 그런 다음 IP를 사용하여 호스트에 HTTP 요청을 보내고 서버에서 HTTP 응답을 받으면 브라우저는 더 나은 효과를 제공합니다. 이 과정에서 뒤에서 조용히 기여하는 것은 웹 서버입니다.
간단히 말하면 웹 서버는 클라이언트(주로 Chrome, Firefox 등의 브라우저)가 요청을 보낼 때까지 물리적 서버에서 실행되는 프로그램입니다. 요청이 수신되면 해당 응답을 생성하여 클라이언트에 반환합니다. 웹 서버는 HTTP 프로토콜을 통해 클라이언트와 통신하므로 HTTP 서버라고도 합니다.
웹 서버
웹 서버의 작동 원리는 복잡하지 않으며 일반적으로 다음 4단계로 나눌 수 있습니다. 연결 설정, 요청 프로세스, 응답 프로세스, 연결 종료 등의 작업을 수행합니다.
연결 설정: 클라이언트는 TCP/IP 프로토콜을 통해 서버에 TCP 연결을 설정합니다. 요청 프로세스: 클라이언트는 서버에 리소스 문서를 요청하기 위해 HTTP 프로토콜 요청 패키지를 서버에 보냅니다. 응답 프로세스: 서버는 HTTP 프로토콜 응답 패킷을 클라이언트에 보냅니다. 요청된 리소스에 동적 언어 콘텐츠가 포함되어 있으면 서버는 동적 언어 해석 엔진을 호출하여 "동적 콘텐츠"를 처리하고 처리된 데이터를 클라이언트에 반환합니다. HTML 문서는 클라이언트에 의해 해석되고 그래픽 결과는 클라이언트 화면에 렌더링됩니다. 연결 종료: 클라이언트와 서버의 연결이 끊어졌습니다.
간단한 웹서버를 구현해 보겠습니다. 샘플 프로그램을 실행한 후 로컬 포트 8000을 수신하고 브라우저에서 http://www.php.cn/:8000에 액세스하면 응답 내용을 볼 수 있습니다. 또한 우리 프로그램은 아래와 같이 클라이언트가 보낸 요청 콘텐츠를 인쇄할 수도 있습니다.
간단한 웹 서버
여기 요청과 응답 모두 HTTP 프로토콜을 준수해야 합니다. HTTP 프로토콜에 대한 자세한 내용은 "HTTP Authoritative Guide"를 읽거나 제가 컴파일한 HTTP 콘텐츠를 읽어보세요.
웹 서버의 주요 임무는 요청에 따라 응답을 반환하는 것이지만, 실제 웹 서버는 고려해야 할 요소가 너무 많기 때문에 위의 예보다 훨씬 더 복잡합니다.
캐싱 메커니즘: 응답 속도를 향상하기 위해 자주 방문하는 페이지를 캐싱합니다. 보안: SYN Flood 공격과 같은 해커의 다양한 공격을 방지합니다. 동시 처리: 동시에 여러 클라이언트에서 시작된 요청에 응답하는 방법 일부 분석을 용이하게 하기 위해 방문 날짜를 기록하십시오.
현재 UNIX 및 LINUX 플랫폼에서 가장 널리 사용되는 무료 웹 서버는 Apache와 Nginx입니다.
웹 애플리케이션
웹 서버는 Http 요청을 수락하고 응답을 반환하는 경우가 많습니다. 응답은 정적 파일이 아니므로 애플리케이션은 요청을 기반으로 해당 응답을 생성해야 합니다. 여기의 애플리케이션은 주로 관련 비즈니스 로직을 처리하고, 데이터베이스를 읽거나 업데이트하고, 다양한 요청에 따라 해당 응답을 반환하는 데 사용됩니다. 이 작업을 수행하는 것은 웹 서버 자체가 아니며 동시성 처리, 보안, 로깅 등과 같은 일부 관련 작업만 담당합니다.
애플리케이션은 다양한 언어(Java, PHP, Python, Ruby 등)로 작성할 수 있습니다. 이 애플리케이션은 웹 서버로부터 클라이언트의 요청을 수신한 후 응답을 반환합니다. 웹 서버. 마지막으로 웹 서버가 클라이언트로 돌아갑니다. 전체 아키텍처는 다음과 같습니다.
웹 애플리케이션
Python을 사용하여 웹을 개발하는 것은 다음과 같습니다. 가장 독창적이고 직접적인 방식으로 1998년에 큰 인기를 끌었던 CGI 표준을 사용합니다. 먼저 웹 서버가 CGI를 지원하고 CGI 처리기를 구성했는지 확인한 다음 CGI 디렉터리를 설정하고 디렉터리에 해당 Python 파일을 추가합니다. 각 Python 파일은 다음과 같이 해당 입력을 처리하고 html 파일을 생성합니다. 예:
# !/usr/bin/python # -*- coding: UTF-8 -*- print "Content-type:text/html" print # 空行,告诉服务器结束头部 print '<html>' print '<head>' print '<meta charset="utf-8">' print '</head>' print '<body>' print '<h2>Hello Word! 我是一个CGI程序</h2>' print '</body>' print '</html>'
이런 방식으로 브라우저에서 파일에 액세스하면 간단한 Hello World 웹 페이지 콘텐츠를 얻을 수 있습니다. CGI를 통해 직접 웹 애플리케이션을 작성하는 것은 간단해 보입니다. 각 파일은 입력을 처리하고 HTML을 생성합니다. 하지만 실제 개발을 하다 보면 많은 불편함을 겪을 수 있습니다. 예를 들면 다음과 같습니다.
각 독립 CGI 스크립트는 데이터베이스 연결 및 종료 코드를 반복적으로 작성할 수 있습니다. 백엔드 개발자는 자신과 관련이 없는 여러 Content-Type 및 기타 HTML 페이지 요소를 보게 됩니다. 웹 프레임워크
초기에는 사이트를 개발하기 위해 많은 반복 작업이 이루어졌습니다. 나중에는 중복을 줄이고 복잡하고 혼란스러운 코드 작성을 피하기 위해 웹의 핵심 프로세스를 추출했습니다. 다양한 A 웹 프레임워크를 개발 및 개발하였습니다. 프레임워크를 사용하면 데이터베이스 연결과 같은 반복 작업에 대해 걱정할 필요 없이 명확하고 유지 관리가 쉬운 코드 작성에 집중할 수 있습니다.
아래 그림과 같이 보다 고전적인 웹 프레임워크 중 하나가 MVC 아키텍처를 채택합니다.
MVC 아키텍처
사용자가 URL을 입력하고 클라이언트가 요청을 보내고 컨트롤러(Controller)가 먼저 요청을 받은 다음 모델(Models)을 사용하여 데이터베이스에서 필요한 모든 데이터를 검색하고 필요한 처리를 수행한 후 전송합니다. 처리된 결과를 뷰(View)에 전송하면 뷰는 획득한 데이터를 사용하여 Html 응답을 렌더링 및 생성하고 이를 클라이언트에 반환합니다.
파이썬 웹 프레임워크 플라스크를 예로 들어 보겠습니다. 프레임워크 자체는 애플리케이션을 구성하는 데 사용하는 아키텍처를 제한하지 않지만 플라스크는 MVC 방식으로 애플리케이션 구성을 잘 지원할 수 있습니다.
컨트롤러: 플라스크 다음과 같이 데코레이터를 사용하여 라우팅 항목을 추가할 수 있습니다.
@app.route('/') def main_page(): pass
모델: 주로 필요한 데이터를 검색하는 데 사용됩니다. 다음 기능과 같이 작동합니다:
@app.route('/') def main_page(): """Searches the database for entries, then displays them.""" db = get_db() cur = db.execute('select * from entries order by id desc') entries = cur.fetchall() return render_template('index.html', entries=entries)
View: 플라스크는 jinja2를 사용하여 페이지를 렌더링합니다.
{% for entry in entries %} <li> <h2>{{ entry.title }}</h2> <p>{{ entry.text|safe }}</p> </li> {% else %} <li><em>No entries yet. Add some!</em></li> {% endfor %}
Python에는 많은 웹 프레임워크가 있고 동시에 많은 웹 서버(Apache, Nginx, Gunicorn 등)가 있어야 한다는 것을 알고 있습니다. 프레임워크와 웹 서버 간에 수행됩니다. 설계 중에 서로 일치하지 않는 경우 프레임워크를 선택하면 웹 서버의 선택이 제한되므로 이는 분명히 불합리합니다.
그렇다면 웹 서버 코드나 네트워크 프레임워크 코드를 수정하지 않고 원하는 서버를 사용하고 여러 다른 네트워크 프레임워크를 일치시킬 수 있는지 확인하는 방법은 무엇일까요? 그냥 인터페이스를 따르십시오. Python의 경우 WSGI(Web Server Gateway Interface, Web Server Gateway Interface)입니다. 예를 들어 Java의 Servlet API 및 Ruby's Rack과 같은 다른 프로그래밍 언어에도 유사한 인터페이스가 있습니다.
Python WSGI의 등장으로 개발자는 더 이상 서로를 제한하지 않고 웹 프레임워크와 웹 서버의 선택을 분리할 수 있습니다. 이제 다양한 웹 서버와 웹 프레임워크를 혼합하고 일치시켜 요구 사항에 맞는 조합을 선택할 수 있습니다. 예를 들어 Gunicorn 또는 Nginx/uWSGI를 사용하여 Django, Flask 또는 web.py 애플리케이션을 실행할 수 있습니다.
웹 사이트 구축을 위한 Python의 웹 서버 및 웹 프레임워크에 대한 더 많은 기사를 보려면 PHP 중국어 사이트를 주목하세요!