Harvard CS50X - Web开发笔记

使用笨方法用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应用程序.
  • @app.route("/")
    • 告诉Flask我想建立的应用程序, 其中一个route需要监听 "/",
    • 当Flask收到用户发来的 / 请求时, 执行下面的函数

使用模板文件

创建一个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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值