【问题标题】:How can I debug my code so my HTML link opens the correct page as coded?如何调试我的代码,以便我的 HTML 链接按照编码打开正确的页面?
【发布时间】: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


    【解决方案1】:

    我认为,如果您仔细查看烧瓶日志,则无需调试,它应该为您提供足够的信息。特别是在单击索引中的链接时对reference 的调用。该调用的方法是什么? reference 中该方法的程序流程是什么?

    (在我意识到问题是关于调试之前,我最初已经解释了这个问题。如果上面的建议没有帮助,剧透可能会有所帮助)

    链接 ( &lt;a href="/reference" class="btn btn-primary"&gt;Reference&lt;/a&gt;) 发送一个 GET 请求。 reference 中的 GET 分支调用没有context 的索引,因此是“仅标题”。一种解决方案是将index 中的链接替换为表单和提交元素(例如buttoninput)。

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多