会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132358个问题

SharedScreenshot1.jpg

SharedScreenshot.jpg

老师,麻烦看看我的代码,我的代码到网页运行以后输入用户名和密码然后登录,会跳到初始状态,不显示登录成功,输入错误也会跳到初始状态。下面是源代码:

from flask import Flask,request,render_template
from flask.views import MethodView

app = Flask(__name__)

# @app.route('/login/',methods=['GET','POST'])
# def login():
#     if request.method == 'GET':
#         return render_template('login05.html')
#     elif request.method == 'POST':
#         uname = request.form.get('uname')
#         pwd = request.form.get('pwd')
#         print(uname)
#         print(pwd)
#         if uname == 'zs' and pwd == '123':
#             return '登录成功'
#         else:
#             return render_template('login05.html')

class LoginView(MethodView):
    def get(self):
        return render_template('login05.html')
    def post(self):
        uname = request.form.get['uname']
        pwd = request.form.get['pwd']
        print(uname)
        print(pwd)
        if uname == 'zs' and pwd == '123':
            return "登录成功!"
        else:
            return render_template('login05.html',msg='用户名或密码错误')

app.add_url_rule('/login/',view_func=LoginView.as_view('login'))

if __name__ == '__main__':
    app.run(debug=True)
    
下面是html05.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录页面</title>
</head>

<body>

    <h2>Login</h2>
    <form action="/login/" methods='POST'>
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="uname"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="pwd"></td>
            </tr>
            <tr>
                <td><input type="submit" value="登录"></td>
            </tr>
        </table>
    </form>
    <span style="color: red;">{{ msg }}</span>
</body>

</html>


Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask视图高级 677楼

老师,你好。

关于删除数据这一块,上一节视频删除数据的话如果外键里设置了nullable=Flase,外键就设不了为空,主键自然也就删除不了,没有给nullable=Flese的话外键值会设置为NUll,然后会把主键的数据也给干掉的啊。

在本章视频中老师并没有在外键里设置这个nullable类型,而是直接用delete就可以删除数据,删除的数据只是把指定的数据给删除,并没有把关联表的主键数据给删除,这是为什么呢,我已经懵圈了。

from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,\
    Date,DateTime,Time,String,Text,func,or_,and_,ForeignKey,Table
from sqlalchemy.dialects.mysql import LONGTEXT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,relationship,backref

HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'first_sqlalchemy'
USERNAME = 'root'
PASSWORD = '123456'

DB_URI ="mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

engine = create_engine(DB_URI)
Base = declarative_base(engine)

session = sessionmaker(engine)()

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer,primary_key=True,autoincrement=True)
    uname = Column(String(50),nullable=False)

class Article(Base):
    __tablename__ = 'article'
    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(50), nullable=False)
    #使用外键与主表关联一起
    uid = Column(Integer,ForeignKey("user.id"))

    author=relationship('User',backref='articles')  #cascade默认为save-update

#增加数据
def add_data():
    Base.metadata.drop_all() #删除表
    Base.metadata.create_all()  #重新创建表

    user = User(uname="momo")
    article = Article(title="华为5G")
    article.author = user
    session.add(article)
    session.commit()

#删除数据
def oper_data():
    article = session.query(Article).first()  #查找Article中的第一条数据
    session.delete(article)                   #删除
    session.commit()                          #提交

if __name__ == '__main__':
    # add_data()
    oper_data()

image.pngimage.png

Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask数据库 678楼
Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/虚拟环境 680楼
Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask数据库 681楼

代码:

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'


class TelephoneConverter(BaseConverter):
    regex = r"1[345789]/d{9}"


app.url_map.converters['tel'] = TelephoneConverter


@app.route('telephone/<tel:pnum>')
def my_telephone(pnum):
    return '您请求过来的电话号码值为:%s' % pnum


if __name__ == '__main__':
    app.run()

报错:

FLASK_APP = app.py

FLASK_ENV = development

FLASK_DEBUG = 0

In folder H:/python_exec/自定义URL

H:\python_virtualenv\flask_env\Scripts\python.exe -m flask run

 * Serving Flask app "app.py"

 * Environment: development

 * Debug mode: off

Traceback (most recent call last):

  File "h:\python37\lib\runpy.py", line 193, in _run_module_as_main

    "__main__", mod_spec)

  File "h:\python37\lib\runpy.py", line 85, in _run_code

    exec(code, run_globals)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\__main__.py", line 15, in <module>

    main(as_module=True)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 967, in main

    cli.main(args=sys.argv[1:], prog_name="python -m flask" if as_module else None)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 586, in main

    return super(FlaskGroup, self).main(*args, **kwargs)

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\core.py", line 782, in main

    rv = self.invoke(ctx)

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\core.py", line 1259, in invoke

    return _process_result(sub_ctx.command.invoke(sub_ctx))

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\core.py", line 1066, in invoke

    return ctx.invoke(self.callback, **ctx.params)

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\core.py", line 610, in invoke

    return callback(*args, **kwargs)

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\decorators.py", line 73, in new_func

    return ctx.invoke(f, obj, *args, **kwargs)

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\core.py", line 610, in invoke

    return callback(*args, **kwargs)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 848, in run_command

    app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 305, in __init__

    self._load_unlocked()

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 330, in _load_unlocked

    self._app = rv = self.loader()

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 388, in load_app

    app = locate_app(self, import_name, name)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 240, in locate_app

    __import__(module_name)

  File "H:\python_exec\自定义URL\app.py", line 19, in <module>

    @app.route('telephone/<tel:pnum>')

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\app.py", line 1315, in decorator

    self.add_url_rule(rule, endpoint, f, **options)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\app.py", line 98, in wrapper_func

    return f(self, *args, **kwargs)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\app.py", line 1275, in add_url_rule

    rule = self.url_rule_class(rule, methods=methods, **options)

  File "H:\python_virtualenv\flask_env\lib\site-packages\werkzeug\routing.py", line 666, in __init__

    raise ValueError("urls must start with a leading slash")

ValueError: urls must start with a leading slash


Process finished with exit code 1


环境:

    pycharm2020.1

Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask视图基础和URL 682楼

from sqlalchemy import create_engine,Column,Integer,String,Float,DECIMAL,Boolean,Enum,Date,DateTime,Time,Text
from sqlalchemy.dialects.mysql import LONGTEXT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,relationship
from datetime import date,datetime,time
from sqlalchemy import func,or_,ForeignKey
import enum
import random

#准备连接数据库信息
HOSTNAME="127.0.0.1"
PORT="3306"
DATABASE="first_sqlclchemy"
USERNAME="root"
PASSWORD="root"

#按照上述格式组织数据库信息
DB_URI="mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

#创建数据库引擎
engine=create_engine(DB_URI)

#需求:创建好一个ORM模型 并映射到指定的数据库中成为  表
Base=declarative_base(engine)

session=sessionmaker(engine)()

#需求:sqlalchemy实现外键 以及四种约束
#主表/从表
class User(Base):
    __tablename__="user"
    id=Column(Integer,primary_key=True,autoincrement=True)
    uname=Column(String(50),nullable=False)
    #添加属性
    # newss=relationship("News")

    def __repr__(self):
        return "<User(uname:{0})>".format(self.uname)

class News(Base):
    __tablename__="news"
    id=Column(Integer,primary_key=True,autoincrement=True)
    title=Column(String(50),nullable=False)
    content=Column(Text,nullable=False)
    #实现外键 外键必须在从表中
    uid=Column(Integer,ForeignKey("user.id")) #默认删除策略为RESCRICT
    
    #添加属性 优化2表查询操作
    author=relationship("User",backref="newss")

    def __repr__(self):
        return "<News(title:{0},content:{1})>".format(self.title,self.content)

#创建表
# Base.metadata.drop_all()
# Base.metadata.create_all()

#添加测试数据
# user=User(uname="momo")
# session.add(user)
# session.commit()
#
# news1=News(title="AAA",content="123",uid=1)
# news2=News(title="BBB",content="456",uid=1)
# session.add_all([news1,news2])
# session.commit()

#需求:ORM层面外键和一对多关系
#查询某篇新闻的 作者
# news=session.query(News).first()
# print(news)
# print(news.uid) #拿到这篇新闻是哪个id用户写的
# user=session.query(User).get(news.uid)
# print(user)
# print(user.uname)

#总结:上述代码能实现需求,但是操作太麻烦,可以引入OMR模型进行优化

#进行优化
# news=session.query(News).first()
# print(news.author.uname)

#需求2 通过作者名字查询他写了哪些文章
users=session.query(User).first()
print(users.newss.title)
# news=session.query(News).first()
# print(news.author.uname)

老师 为什么这个查询就可以查到User类中的uname属性 

users=session.query(User).first()
print(users.newss.title)

这样为什么就不可以了 同样都是在类中添加一个属性 为什么这个就不能查询 直接报错

image.png

Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask数据库 684楼
Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask高级 685楼
Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/虚拟环境 687楼
Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask数据库 690楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637