使用笨方法用python创建一个web程序
from http.server import BaseHTTPRequestHandler, HTTPServer
class HTTPServer_RequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Cotent-type", "text/html")
self.end_headers()
self.wfile.write(b"<!DOCTYPE html>")
self.wfile.write(b"<html lang='en'>")
self.wfile.write(b"<head>")
self.wfile.write(b"<title>hello, title</title>")
self.wfile.write(b"</head>")
self.wfile.write(b"<body>")
self.wfile.write(b"<p>hello, world</p>")
self.wfile.write(b"</body>")
self.wfile.write(b"</html>")
port = 8080
server_address = ("0.0.0.0", port)
httpd = HTTPServer(server_address, HTTPServer_RequestHandler)
httpd.serve_forever()
- 每次用户通过
GET
进入网站时,do_GET
函数就会自动执行. - 这里的
self
代表web服务器
Flask
Flask会自动为我们构建这些html代码, 可以更方便的设定服务器IP地址, 更 方便的设定端口号, 以及回应请求.
第一个Flask项目
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/")
def index():
return "hello, world"
- 导入flask框架, 可以看做要求进库许可
- from flask import Flask
- 然后导入几个函数
render_template
和 特殊全局变量request
app = Flask(__name__)
- 在每个Flask应用程序前都要输入这行代码. 这代表将
application.py
这个文件转成一个web应用程序.
- 在每个Flask应用程序前都要输入这行代码. 这代表将
@app.route("/")
- 告诉Flask我想建立的应用程序, 其中一个route需要监听
"/"
, - 当Flask收到用户发来的
/
请求时, 执行下面的函数
- 告诉Flask我想建立的应用程序, 其中一个route需要监听
使用模板文件
创建一个template文件, 把index.html文件放在目录中.
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello</title>
</head>
<body>
hello, {{ name }}
</body>
</html>
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/")
def index():
return "hello, world"
给模板文件传数据
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/")
def index():
name = request.args.get("name", "world")
return render_template("index.html", name=name)
- 定义一个变量name
- 检查传入请求, 检查它的实参或是传入的任何HTTP参数, 得到参数name
- 可以给name设置一个默认值.
用户注册实例
application.py
from flask import Flask render_template, request
app = Flask(__name__)
@app.route("/")
def index():
return render_template("index.html")
@app.route("/register", methods=["POST"])
def register():
name = request.form.get("name")
dorm = request.form.get("dorm")
if not name or not dorm:
return "没有输入"
return render_template("success.html")
- 获取用户提交的信息, 使用
request.args.get("name")
request.args
是键值对的集合- 当通过post提交的时候, 使用
request.form.get()
获取用户提交的信息 - Flask用GET获取args , 用POST获取form
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>Register</h1>
<form action=>
<input type="text" placeholder="Name" name="name">
<select name="dorm">
<option value="Apley Court">Apley Court</option>
<option value="Canaday">Canaday</option>
</select>
<input type="submit" value="Register">
</form>
</body>
</html>
success.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
success
</body>
</html>
创建通用模板
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
使用通用模板
{%
其实是jinja的语法, jinja是一个模板语言, Flask默认支持jinja
- 引入(延伸)通用模板 :
{% extends "base.html" %}
存储用户信息
applications.py
from flask import Flask render_template, request
app = Flask(__name__)
# 存储学生信息的list
students = []
@app.route("/")
def index():
return render_template("index.html")
@app.route("/registrants")
def registrants():
return render_template("registered.html", students=students)
@app.route("/register", methods=["POST"])
def register():
name = request.form.get("name")
dorm = request.form.get("dorm")
if not name or not dorm:
return "没有输入"
students.append(f"{name} from {dorm}")
return render_template("success.html")
registered.html
{% block body %}
<ul>
{% for student in students %}
<li> {{student}} </li>
{% endfor %}
</ul>
{% endblock %}
把用户信息保存在文件里面
import csv
# 把用户信息保存在文件里
@app.route("/register", methods=["POST"])
def register():
if not request.form.get("name") or not request.form("dorm"):
return render_template("failure.html")
# a代表append, 添加
file = open("registered.csv", "a")
# 使用csv库, 调用writer, 意思是创建csv文件
writer = csv.writer(file)
writer.writerow((request.form.get("name"), request.form.get("dorm")))
file.close()
return render_template("success.html")
# 打开文件读取用户信息到页面
@app.route("/registered")
def registered():
file = open("registered.csv", "r")
reader = csv.reader(file)
students = list(reader)
return render_template("registered.html", students=students)
可以把打开文件的代码简写为
@app.route("/registered")
def registered():
with open("registered.csv", "r") as file:
reader = csv.reader(file)
students = list(reader)
return render_template("registered.html", students=students)
实现搜索功能
from flask import Flask, render_template, request
app = Flask(__name__)
WORDS = []
with open("large", "r") as file:
for line in file.readlines():
WORDS.append(line.rstrip())
@app.route("/")
def index():
return render_template("index.html")
@app.route("/search")
def search():
words = []
words = [word for word in WORDS if word.startswith(request.args.get("q"))]
return render_template("search.html", words=words)