{"id":18663249,"url":"https://github.com/ronething/todolist","last_synced_at":"2026-04-27T20:31:03.720Z","repository":{"id":103357093,"uuid":"164768517","full_name":"ronething/todolist","owner":"ronething","description":"简单的待办事项列表 simple todolist","archived":false,"fork":false,"pushed_at":"2019-01-09T09:52:23.000Z","size":9,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-05-18T04:36:20.830Z","etag":null,"topics":["flask","python3"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ronething.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-01-09T02:09:00.000Z","updated_at":"2024-06-09T12:44:46.000Z","dependencies_parsed_at":"2023-07-07T22:00:57.108Z","dependency_job_id":null,"html_url":"https://github.com/ronething/todolist","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ronething/todolist","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ronething%2Ftodolist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ronething%2Ftodolist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ronething%2Ftodolist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ronething%2Ftodolist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ronething","download_url":"https://codeload.github.com/ronething/todolist/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ronething%2Ftodolist/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32354563,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T20:07:02.737Z","status":"ssl_error","status_checked_at":"2026-04-27T20:07:00.910Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flask","python3"],"created_at":"2024-11-07T08:15:50.505Z","updated_at":"2026-04-27T20:31:03.705Z","avatar_url":"https://github.com/ronething.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TODOlist\n\n参考 https://github.com/lalor/todolist\n\n\u003e 顺便把原作者项目的TODO做了。😊\n\n## 使用方法：\n\n\b创建一个数据库 编码 `utf8mb4`\n\n创建数据库表结构\n\n类似这样\n\n```sql\nmysql -h127.0.0.1 -uroot -proot -Dtest -P3306 \u003c todolist_test.sql\n```\n\n或者直接文件导入\n\n修改\b `app/setting.py` 配置 将对应的数据库连接参数修改正确\n\n`pip install -r requirements.txt`\n\n然后运行 \b`manage.py`\n\n看到这样应该就是好了。\n\n![](https://ws1.sinaimg.cn/large/ecb0a9c3gy1fz0fkjxw34j20zs0a2t9l.jpg)\n\n![](https://ws1.sinaimg.cn/large/ecb0a9c3gy1fz0fkycl9aj22e81iyq9y.jpg)\n\n## 涉及的一些东西(其实我是现学的🎸 轻喷谢谢)\n\n-   一开始我用原作者的仓库克隆下来是运行不了的。搞了一会儿发觉搞不定，所以就索性自己搞。\n\n### 目录结构\n\n```\n.\n├── README.md\n├── __pycache__\n├── app\n│   ├── __init__.py\n│   ├── __pycache__\n│   │   ├── __init__.cpython-36.pyc\n│   │   ├── models.cpython-36.pyc\n│   │   └── setting.cpython-36.pyc\n│   ├── models.py\n│   ├── setting.py\n│   ├── static\n│   │   ├── css\n│   │   ├── fonts\n│   │   └── js\n│   ├── templates\n│   │   ├── base.html\n│   │   ├── index.html\n│   │   ├── login.html\n│   │   ├── modify.html\n│   │   └── register.html\n│   └── web\n│       ├── __init__.py\n│       ├── __pycache__\n│       ├── forms.py\n│       └── views.py\n├── manage.py\n├── requirements.txt\n├── todolist_test.sql\n```\n\n### 模块、库\n\n-   `Flask-Login`\n\n    Flask-Login 为 Flask 提供了用户会话管理。它处理了日常的登入，登出并且长时间记住用户的会话。\n\n    [文档](http://www.pythondoc.com/flask-login/)\n\n    主要是用了 `login_required` 装饰器做登录权限控制\n\n    ```python\n        @wraps(func)\n        def decorated_view(*args, **kwargs):\n            if current_app.login_manager._login_disabled:\n                return func(*args, **kwargs)\n            elif not current_user.is_authenticated:\n                return current_app.login_manager.unauthorized()\n            return func(*args, **kwargs)\n        return decorated_view\n    ```\n\n-   `Flask-SQLAlchemy`\n\n    Flask-SQLAlchemy 是一个为您的 Flask 应用增加 SQLAlchemy 支持的扩展。它需要 SQLAlchemy 0.6 或者更高的版本。它致力于简化在 Flask 中 SQLAlchemy 的使用，提供了有用的默认值和额外的助手来更简单地完成常见任务。\n\n    [文档](http://www.pythondoc.com/flask-sqlalchemy)\n\n    SQLAlchemy 就是 \borm 框架咯。\n\n    Object-Relational Mapping，把关系数据库的表结构映射到对象上，所以就通过操作对象来进行数据库的增删改查。\n\n-   `Flask-Bootstrap`\n\n    Flask-Bootstrap 把 Bootstrap 打包进一个 扩展，这个扩展主要由一个叫“bootstrap”的蓝本（blueprint）组成。不过好久没有更新了，不支持 bootstrap 4 ，有时间可以搞一下 [Bootstrap-Flask](https://github.com/greyli/bootstrap-flask)。\n\n    [Flask-Bootstrap Github 仓库地址](https://github.com/mbr/flask-bootstrap)\n    \n    建议看一下\b仓库里的静态文件 \n\n    \bhttps://github.com/mbr/flask-bootstrap/blob/master/flask_bootstrap/templates/bootstrap/\n\n-   `Flask-WTF`\n\n    Flask-WTF 提供了简单地 WTForms 的集成。\n\n-   `pymysql` -- mysql-connector 驱动\n\n    PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库。\n\n### 作为笔记吧。（我比较菜）\n\n-   flask 的 Blueprint 蓝图注册\n\n    官方文档\n\n    A Blueprint is a way to organize a group of related views and other code. Rather than registering views and other code directly with an application, they are registered with a blueprint. Then the blueprint is registered with the application when it is available in the factory function.\n\n    通俗讲就是蓝图可以各个模块的视图函数写在不同的py文件当中。也不能这么说。就是不都是用 app.route() 这样子，例如我有一个模块 web,我注册了蓝图，然后我就可以用 web.route() 写视图函数。\n\n    create:\n\n    ```python\n    from flask import Blueprint\n\n    web = Blueprint(\"web\", __name__)\n    ```\n    \n    register:\n\n    ```python\n    from app.web import web\n\n    app.register_blueprint(web)\n    ```\n\n-   Flask-SQLAlchemy 初始化以及操作\n\n    ```python\n    from flask_sqlalchemy import SQLAlchemy\n    db = SQLAlchemy(app)\n    db.create_all()\n    \b# 看了源码才知道删除所有表是 drop_all()\n    db.drop_all()\n    ```\n\n    ```python\n    def create_all(self, bind='__all__', app=None):\n        \"\"\"Creates all tables.\n\n        .. versionchanged:: 0.12\n           Parameters were added\n        \"\"\"\n        self._execute_for_all_tables(app, bind, 'create_all')\n\n    def drop_all(self, bind='__all__', app=None):\n        \"\"\"Drops all tables.\n\n        .. versionchanged:: 0.12\n           Parameters were added\n        \"\"\"\n        self._execute_for_all_tables(app, bind, 'drop_all')\n    ```\n\n-   导入配置文件\n\n    ```python\n    app = Flask(__name__)\n    app.config.from_object('app.setting')\n    # 引用 \bapp.config[\"DEBUG\"]\n    ```\n\n-   路由的写法\n\n    最好是 /login/ 而不是 /login （👤个人觉得）\n\n    - /login/\n\n        如果路由写 /login/ 当你输入网址 /login 的时候\b会 301 重定向到 /login/\n\n    -  /login\n\n       如果路由写 /login 当你输入网址 /login/ 的时候\b会 404 Not Found\n\n-   密码加密🔐\n\n    ```python\n    # 生成\n    from werkzeug.security import generate_password_hash\n    generate_password_hash(form.password.data)\n    \n    # 检查\n    from werkzeug.security import check_password_hash\n    check_password_hash(self.password, password)\n    ```\n\n-   端口、\bIP等写进配置文件\n\n    ```python\n    DEBUG = True\n    HOST = \"127.0.0.1\"\n    PORT = 9090\n    ```\n\n-   数据库连接 URL\n\n    用的是 pymysql 驱动 所以 `mysql+pymysql`\n\n    `mysql+pymysql://root:root@localhost:3306/todolist_test?charset=utf8mb4\"`\n\n## 最终效果\n\n### register\n\n![](https://ws1.sinaimg.cn/large/ecb0a9c3gy1fz0h0kl8hsj22e81iy102.jpg)\n\n### login\n\n![](https://ws1.sinaimg.cn/large/ecb0a9c3gy1fz0fkycl9aj22e81iyq9y.jpg)\n\n### home page\n\n![](https://ws1.sinaimg.cn/large/ecb0a9c3gy1fz0gzsp94ej22e81iythl.jpg)\n\n## 总结\n\n前端有点菜。后端不成熟。\n\n还是要多加学习。⛽️","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fronething%2Ftodolist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fronething%2Ftodolist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fronething%2Ftodolist/lists"}