Flask框架下的sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045)问题

Posted YDragon_22

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask框架下的sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045)问题相关的知识,希望对你有一定的参考价值。

项目场景:

用flask框架搭起项目,连接数据库中出现1045的问题。

问题描述

提示:确保数据库用户、密码没问题后。
在flask启动后,访问mysql的时候出现如下问题:
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, “Access denied for user ‘root’@‘localhost’ (using password: YES)”) (Background on this error at: http://sqlalche.me/e/e3q8)

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)") (Background on this error at: http://sqlalche.me/e/e3q8)

原因分析:

提示:这个问题搜了很多都是提示要更改数据库密码,还有一些是本地数据不对外开放问题,我的问题是依赖版本问题。

原因一般有几种:

  1. 常见问题有mysql登录出现1045的问题,这个问题很简单,更改本地的my.ini文件里面的参数即可。
  2. 确保数据库登录、访问没问题后,就是连接数据语句出现了错误。

解决方案:

提示:需要改掉数据连接URI地址

首先我测试了数据库登录注册有没有问题,这里从网上搜了一个pymysql连接数据库的代码。

import pymysql

def connectdb():
    print("连接到mysql服务器...")
    db = pymysql.connect(
        host="localhost",
        user="root",
        passwd="123",
        port=3306,
        db="Graduationdesign",
        charset="utf8",
        cursorclass=pymysql.cursors.DictCursor
    )
    print("连接成功!")
    return db

connectdb()

测试通过后,就可以修改URI地址,从文档找出合适当前版本的连接方法
我之前用的连接方法换到了朋友的环境下竟然不能用了,我认为是依赖版本的问题,我用的SQLAlchemy和朋友用的不一样,所以出现了问题,这里更换了URI就不会报错了。

# SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:Password123$@localhost:3306/Graduationdesign?charset=utf8"
  SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123@localhost:3306/Graduationdesign"

SQLAlchemy 1.4 文档地址:https://docs.sqlalchemy.org/en/14/errors.html#error-e3q8

flask框架下的jinja2模板引擎

flask 框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html

flask 框架下的jinja2模块引擎(2):https://www.cnblogs.com/chichung/p/9775099.html

本文主要记录下 jinja2 的模板继承。

 

  • 模板继承是什么?

在模板中,可能会遇到以下情况:

  • 多个模板具有完全相同的顶部和底部内容
  • 多个模板中具有相同的模板代码内容,但是内容中部分值不一样
  • 多个模板中具有完全相同的 html 代码块内容

像遇到这种情况,可以使用 JinJa2 模板中的 继承 来进行实现

模板继承是为了重用模板中的公共内容。一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。

  • 相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。
  • 子模板使用 extends 指令声明这个模板继承自哪个模板
  • 父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()
     
  • 模板继承的使用

例如有一个父模板 base.html 。有两个子模板01.html 和 02.html 都是继承该模板的某一部分。

base.html 如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}Title{% endblock title %}</title>
</head>
<body>
    <p>父模板的头部,每个网页都一样的,不需要更改</p>
    {% block content %}
    <p>父模板的中间部分,每个网页都不一样的,需要更改</p>
    {% endblock content %}
    <p>父模板的脚部,每个网页都一样的,不需要更改</p>
</body>
</html>

{% block xxx %} 与 {% endblock xxx %} 的中间可以进行替换。而其他的内容可以继承。模板继承可以极大地提高开发效率。

01.html 如下:

{% extends "base.html" %}
{% block title %}
<p>01的标题</p>
{% endblock title  %}
{% block content %}
<p>01页面独有的内容</p>
{% endblock content %}

02.html 如下:

{% extends "base.html" %}
{% block title %}
<p>02的标题</p>
{% endblock title  %}
{% block content %}
<p>02页面独有的内容</p>
{% endblock content %}

 

  • 模板中可以使用的变量和函数

1. config

你可以从模板中直接访问Flask当前的config对象:

{{config.SQLALCHEMY_DATABASE_URI}}
sqlite:///database.db

2. request

就是flask中代表当前请求的request对象:

{{request.url}}
http://127.0.0.1

3. session

为Flask的session对象

{{session.new}}
True

4. g变量

在视图函数中设置g变量的 name 属性的值,然后在模板中直接可以取出

{{ g.name }}

5.url_for()

url_for会根据传入的路由器函数名,返回该路由对应的URL,在模板中始终使用url_for()就可以安全的修改路由绑定的URL,则不比担心模板中渲染出错的链接:

{{url_for(‘home‘)}}
/

如果我们定义的路由URL是带有参数的,则可以把它们作为关键字参数传入url_for(),Flask会把他们填充进最终生成的URL中:

{{ url_for(‘post‘, post_id=1)}}
/post/1

 

以上是关于Flask框架下的sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045)问题的主要内容,如果未能解决你的问题,请参考以下文章

Flask框架下的sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045)问题

Pyhton3框架Flask 准备工作

windows下的flask环境搭建

python web开发之flask框架学习 加载模版

flask SQLAlchemy

FLASK+VUE+sqlite3实现前后端分离框架