【发布时间】:2021-12-29 11:11:39
【问题描述】:
我正在做 cs50 并在我的最后一个项目中工作,我正在创建一个新闻应用程序。我正在尝试添加一个页面,使用户能够在下一步中添加对文章的引用或反对文章,但我很困惑。我不知道为什么,但是当我打开指向“参考”的链接(请参阅下面的索引代码)时,它基本上只会打开带有标题的索引页面。在下面分享我的代码 - 非常感谢帮助!
索引.html
{% extends "layout.html" %}
{% block title %}
Index
{% endblock %}
{% block main %}
<div class="jumbotron" style="color:black">
<h1 style="color:black">
Flask News App
</h1>
</div>
<div class="container">
{% for author, title, url, i in context %}
<div class="row text-left">
<div class="col-sm-8">
<h2>{{title}}</h2>
<h4><i>Authored by {{author}}</i> </h4>
<p>Link: <a href={{url}}>{{url}}</a></p>
<a href="/reference" class="btn btn-primary">Reference</a>
</div>
<div class="col-sm-4">
<img src="{{i}}" alt="">
</div>
</div>
{% endfor %}
</div>
{% endblock %}
Layout.html 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, width=device-width">
<!-- http://getbootstrap.com/docs/4.5/ -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
<link href="/static/styles.css" rel="stylesheet">
<!-- http://getbootstrap.com/docs/4.5/ -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx" crossorigin="anonymous"></script>
<title>C$50 Final Project</title>
</head>
<body>
<nav class="navbar navbar-expand-md navbar-light bg-light border">
<a class="navbar-brand" href="/"><span class="blue">C</span><span class="red">$</span><span class="yellow">5</span><span class="green">0</span> <span class="red">Final Project</span></a>
<button aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation" class="navbar-toggler" data-target="#navbar" data-toggle="collapse" type="button">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbar">
{% if session.user_id %}
<ul class="navbar-nav mr-auto mt-2">
<li class="nav-item"><a class="nav-link" href="/">Home</a></li>
<li class="nav-item"><a class="nav-link" href="/references">References</a></li>
</ul>
<ul class="navbar-nav ml-auto mt-2">
<li class="nav-item"><a class="nav-link" href="/logout">Log Out</a></li>
</ul>
{% else %}
<ul class="navbar-nav ml-auto mt-2">
<li class="nav-item"><a class="nav-link" href="/register">Register</a></li>
<li class="nav-item"><a class="nav-link" href="/login">Log In</a></li>
</ul>
{% endif %}
</div>
</nav>
{% if get_flashed_messages() %}
<header>
<div class="alert alert-primary border text-center" role="alert">
{{ get_flashed_messages() | join(" ") }}
</div>
</header>
{% endif %}
<main class="container p-5">
{% block main %}{% endblock %}
</main>
<footer class="small text-center text-muted">
Data provided for free by <a href="https://iextrading.com/developer">IEX</a>. View <a href="https://iextrading.com/api-exhibit-a/">IEX’s Terms of Use</a>.
</footer>
</body>
</html>
Reference.html 代码
{% extends "layout.html" %}
{% block title %}
Reference
{% endblock %}
{% block main %}
<h6>Please provide the below details to record your reference:</h6>
<form action="/reference" method="post">
<div class="form-group">
<input name="type" type="radio" value="for">For<br>
<input name="type" type="radio" value="against">Against<br>
</div>
<div class="form-group">
<input class="form-control" name="refurl" placeholder="http://example.com" type="url">
</div>
<button class="btn btn-primary" type="submit">Buy</button>
</form>
{% endblock %}
Application.py 代码(这还需要大量工作)
import os
from cs50 import SQL
from flask import Flask, flash, redirect, render_template, request, session
from flask_session import Session
from tempfile import mkdtemp
from werkzeug.exceptions import default_exceptions, HTTPException, InternalServerError
from werkzeug.security import check_password_hash, generate_password_hash
from newsapi import NewsApiClient
from helpers import apology, login_required, lookup
# Configure application
app = Flask(__name__)
# Ensure templates are auto-reloaded
app.config["TEMPLATES_AUTO_RELOAD"] = True
# Ensure responses aren't cached
@app.after_request
def after_request(response):
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
response.headers["Expires"] = 0
response.headers["Pragma"] = "no-cache"
return response
# Configure session to use filesystem (instead of signed cookies)
app.config["SESSION_FILE_DIR"] = mkdtemp()
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)
# Configure CS50 Library to use SQLite database
db = SQL("sqlite:///ref.db")
# Make sure API key is set
if not os.environ.get("API_KEY"):
raise RuntimeError("API_KEY not set")
@app.route("/", methods=["GET", "POST"])
@login_required
def index():
user_id = session["user_id"]
newsapi = NewsApiClient(api_key='17b3c1988862485294de3a5becae158a')
topheadlines = newsapi.get_top_headlines(category="business")
articles = topheadlines['articles']
author = []
title = []
url = []
img = []
for i in range(len(articles)):
myarticles = articles[i]
author.append(myarticles['author'])
title.append(myarticles['title'])
url.append(myarticles['url'])
img.append(myarticles['urlToImage'])
mydata = zip(author, title, url, img)
return render_template('index.html', context = mydata)
@app.route("/login", methods=["GET", "POST"])
def login():
"""Log user in"""
# Forget any user_id
session.clear()
# User reached route via POST (as by submitting a form via POST)
if request.method == "POST":
# Ensure username was submitted
if not request.form.get("username"):
return apology("must provide username", 400)
# Ensure password was submitted
elif not request.form.get("password"):
return apology("must provide password", 400)
# Query database for username
rows = db.execute("SELECT * FROM users WHERE username = ?", request.form.get("username"))
# Ensure username exists and password is correct
if len(rows) != 1 or not check_password_hash(rows[0]["hash"], request.form.get("password")):
return apology("invalid username and/or password", 400)
# Remember which user has logged in
session["user_id"] = rows[0]["id"]
# Redirect user to home page
return redirect("/")
# User reached route via GET (as by clicking a link or via redirect)
else:
return render_template("login.html")
@app.route("/logout")
def logout():
"""Log user out"""
# Forget any user_id
session.clear()
# Redirect user to login form
return redirect("/login")
@app.route("/register", methods=["GET", "POST"])
def register():
"""Register user"""
if (request.method == "POST"):
username = request.form.get('username')
password = request.form.get('password')
confirmation = request.form.get('confirmation')
if not username:
return apology('Please enter your userame', 400)
elif not password:
return apology('Please enter your password', 400)
elif not confirmation:
return apology('Please confirm your password', 400)
if password != confirmation:
return apology('Invalid entry! Your passwords do not match', 400)
hash = generate_password_hash(password)
try:
db.execute("INSERT INTO users (username, hash) VALUES (?, ?)", username, hash)
return redirect("/login")
except:
return apology ('Username already exists', 400)
else:
return render_template("register.html")
@app.route("/reference", methods=["GET", "POST"])
@login_required
def reference():
if request.method == "POST":
user_id = session["user_id"]
type = request.form.get('type')
refurl = request.form.get('refurl')
if not type:
return apology ("Please select for or against", 400)
elif not refurl:
return apology ("Please enter a link starting with https://...", 400)
try:
db.execute("INSERT INTO references (user_id, type, refurl, url, title) VALUES (?, ?, ?, ?, ?, ?)", user_id, type, refurl, url, title)
return redirect("/")
except:
return apology ("Error, try again", 400)
else:
return render_template("index.html")
@app.route("/references")
@login_required
def references():
"""Show history of references"""
user_id = session["user_id"]
item = db.execute("SELECT user_id, name, article_url, type, url FROM references WHERE user_id = ? ORDER BY datetime", user_id)
return render_template("references.html", references = item)
def errorhandler(e):
"""Handle error"""
if not isinstance(e, HTTPException):
e = InternalServerError()
return apology(e.name, e.code)
# Listen for errors
for code in default_exceptions:
app.errorhandler(code)(errorhandler)
【问题讨论】:
标签: python html debugging cs50