7 月 152021
 

INSTALLED_APPS 默认包括了以下 Django 的自带应用:

django.contrib.admin -- 管理员站点, 你很快就会使用它。
django.contrib.auth -- 认证授权系统。
django.contrib.contenttypes -- 内容类型框架。
django.contrib.sessions -- 会话框架。
django.contrib.messages -- 消息框架。
django.contrib.staticfiles -- 管理静态文件的框架。

默认开启的某些应用需要至少一个数据表,所以,在使用他们之前需要在数据库中创建一些表。migrate 命令检查 INSTALLED_APPS 设置,为其中的每个应用创建需要的数据表。

$ python manage.py migrate

迁移模型

通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移。
迁移是 Django 对于模型定义(也就是你的数据库结构)的变化的储存形式。

(venv) harveymei@MacBookAir mysite % python manage.py makemigrations polls
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Question
- Create model Choice
(venv) harveymei@MacBookAir mysite %

查看迁移命令将会执行的SQL语句

(venv) harveymei@MacBookAir mysite % python manage.py sqlmigrate polls 0001
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" bigint NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
(venv) harveymei@MacBookAir mysite %

自动执行数据库迁移并同步管理你的数据库结构的命令 – 这个命令是 migrate

$ python manage.py migrate

(venv) harveymei@MacBookAir mysite % python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying polls.0001_initial... OK
Applying sessions.0001_initial... OK
(venv) harveymei@MacBookAir mysite %

migrate 命令选中所有还没有执行过的迁移(Django 通过在数据库中创建一个特殊的表 django_migrations 来跟踪执行过哪些迁移)并应用在数据库上 – 也就是将你对模型的更改同步到数据库结构上。

迁移是非常强大的功能,它能让你在开发过程中持续的改变数据库结构而不需要重新删除和创建表 – 它专注于使数据库平滑升级而不会丢失数据。

改变模型需要这三步:

编辑 models.py 文件,改变模型。
运行 python manage.py makemigrations 为模型的改变生成迁移文件。
运行 python manage.py migrate 来应用数据库迁移。
7 月 152021
 

创建项目

$ django-admin startproject mysite

项目目录及文件说明

最外层的 mysite/ 根目录只是你项目的容器, 根目录名称对 Django 没有影响,你可以将它重命名为任何你喜欢的名称。
manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。
里面一层的 mysite/ 目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如 mysite.urls).
mysite/__init__.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
mysite/settings.py:Django 项目的配置文件。
mysite/urls.py:Django 项目的 URL 声明,就像你网站的“目录”。
mysite/asgi.py:作为你的项目的运行在 ASGI 兼容的 Web 服务器上的入口。
mysite/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。

启动用于开发的简易服务器

$ python manage.py runserver

更换端口

$ python manage.py runserver 8080
$ python manage.py runserver 0:8000

创建应用

$ python manage.py startapp polls

函数 include() 允许引用其它 URLconfs。每当 Django 遇到 include() 时,它会截断与此项匹配的 URL 的部分,并将剩余的字符串发送到 URLconf 以供进一步处理。
当包括其它 URL 模式时你应该总是使用 include() , admin.site.urls 是唯一例外。

函数 path() 具有四个参数,两个必须参数:route 和 view,两个可选参数:kwargs 和 name。现在,是时候来研究这些参数的含义了。

path() 参数: route
route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。

这些准则不会匹配 GET 和 POST 参数或域名。例如,URLconf 在处理请求 https://www.example.com/myapp/ 时,它会尝试匹配 myapp/ 。处理请求 https://www.example.com/myapp/?page=3 时,也只会尝试匹配 myapp/。

path() 参数: view
当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。稍后,我们会给出一个例子。

path() 参数: kwargs
任意个关键字参数可以作为一个字典传递给目标视图函数。本教程中不会使用这一特性。

path() 参数: name
为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。
5 月 302021
 
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time    : 2021/5/31 09:46
# @Author  : Harvey Mei <harvey.mei@msn.com>
# @FileName: pwdgen.py
# @IDE     : PyCharm
# @GitHub  : https://github.com/harveymei/

"""
Python 密码生成器
Python Password Generator
指定长度和复杂度的密码批量生成工具
PyCharm缩进,选中代码块按tab键或shift+tab键
批量注释或取消注释,选中代码按command+/键
"""

import string
import random
from datetime import datetime as dt


# https://docs.python.org/3/library/string.html
# https://docs.python.org/3/library/random.html
# 密码字符类型

# 不同等级密码字符组合列表
print("---------------\n"
      "Python 密码生成器\n"
      "---------------\n"
      "1)数字\n"
      "2)数字+小写字母\n"
      "3)数字+小写字母+大写字母\n"
      "4)数字+小写字母+大写字母+符号\n")

password_level = input("请选择密码复杂度等级:(建议为4)")
# 密码复杂度等级
if password_level == '1':
    level = string.digits
elif password_level == '2':
    level = string.digits + string.ascii_lowercase
elif password_level == '3':
    level = string.digits + string.ascii_lowercase + string.ascii_uppercase
elif password_level == '4':
    level = string.digits + string.ascii_lowercase + string.ascii_uppercase + string.punctuation
else:
    print("Error Input")
    exit()

length_input = int(input("请输入密码长度:(建议为12)"))
if length_input == '':
    length_input = 12

number_input = int(input("请输入生成数量:"))
if number_input == '':
    number_input = 1

# 在指定字符组合中取随机字符,循环,直到满足密码长度要求,打印结果
password_list = []
while number_input > 0:
    length = length_input  # 额外增加第三变量,防止嵌套循环length_input > 0第二次值为False的情况
    pwd = ''
    while length > 0:  # 循环指定次数拼接字符串
        pwd = pwd + level[random.randrange(0, len(level))]  # 随机传入字符串切片索引值
        length = length - 1  # 直到满足密码长度退出循环
    password_list.append(pwd)
    number_input = number_input - 1  # 直到满足密码生成数量退出循环

# 遍历列表写入文件
filename = dt.now().strftime("%Y%m%d%H%M%S") + ".txt"
with open(filename, 'wt') as f:
    for password in password_list:
        f.write(password + "\n")

print("\n----------\n"
      "密码生成完成!")
3 月 132021
 
"""
凯撒密码
"""
# 导入模块
import pyperclip

# 待加密信息字符串赋值变量
message = 'This is my secret message.'
# message = 'guv6Jv6Jz!J6rp5r7Jzr66ntrM'
# 指定密钥赋值变量
key = 13
# 指定模式为加密或解密并赋值变量
mode = 'encrypt'
# mode = 'decrypt'
# 定义字符并赋值变量
SYMBOLS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 !?.'
# 定义空字符串赋值变量以存储加解密后的信息
translated = ''

# 定义for循环,遍历待加密消息字符串的每一个字符并赋值变量
for symbol in message:
    # 判断,当待加密消息字符串中字符存在于定义字符集(True)时则执行
    if symbol in SYMBOLS:
        # 使用字符串find()方法在字符串中查找子字符串所在索引值并赋值变量
        # https://docs.python.org/3/library/stdtypes.html#str.find
        symbolIndex = SYMBOLS.find(symbol)

        # 判断当前操作模式为加密或者是解密
        if mode == 'encrypt':
            # 加密模式下,索引值加上密钥值赋值给变量(向后移动)
            translatedIndex = symbolIndex + key
        elif mode == 'decrypt':
            # 解密模式下,索引值减去密钥值赋值给变量(向前移动)
            translatedIndex = symbolIndex - key

        # 判断加解密后字符索引值值大于等于自定义字符集长度值
        if translatedIndex >= len(SYMBOLS):
            # 加解密后字符索引值减去自定义字符集长度并重新赋值给加解密后字符索引值
            translatedIndex = translatedIndex - len(SYMBOLS)
        # 判断加解密后字符索引值小于0时
        elif translatedIndex < 0:
            # 加解密后字符索引值加上自定义字符集长度并重新赋值给加解密后字符索引值
            translatedIndex = translatedIndex + len(SYMBOLS)

        # 使用空字符串值依次拼接使用加解密后字符索引值在自定义字符集中的字符并重新赋值给变量
        translated = translated + SYMBOLS[translatedIndex]

    # 当遍历的待加解密字符不存在于字符集时
    else:
        # 使用空字符串值依次拼接使用遍历的原始字符并重新赋值给变量(即不存在的字符不做加解密)
        translated = translated + symbol

# 打印加解密后的拼接字符串
print(translated)
# 调用模块,将结果复制到剪贴板
3 月 132021
 
"""
反向密码
"""

# 待加密消息字符串赋值变量
message = 'Three can keep a secret, if two of them are dead.'
# 空字符串赋值变量用以存储反转后的加密信息
translated = ''

# 计算待加密消息字符串长度减1并赋值变量i作为字符串最后一个字符的索引值
i = len(message) - 1
# 定义while循环,直到i小于0(False)时终止
while i >= 0:
    # 当前变量值拼接待加密消息字符串索引字符并赋值给变量
    translated = translated + message[i]
    # 打印每一次循环
    print('i is ', i, ', message i is ', message[i], ', translated is ', translated)
    # 执行i减1并将值重新赋值给变量i
    i = i - 1

# 结束循环后打印反转后的加密信息
print(translated)
3 月 022021
 
"""
使用scatter()绘制一系列点
"""
import matplotlib.pyplot as plt

# 向scatter()传递两个分别包含x值和y值的列表
x_values = [1, 2, 3, 4, 5]
y_values = [1, 4, 9, 16, 25]

# 列表传递给scatter()时,依次从每个列表中读取一个值来绘制一个点
plt.scatter(x_values, y_values, s=100)

# 设置图表标题并给坐标轴加上标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)

plt.tick_params(axis='both', which='major', labelsize=14)

plt.show()
3 月 022021
 
"""
使用scatter()绘制散点图
"""
import matplotlib.pyplot as plt

# 绘制单个点,使用scatter()函数并传递一对x和y坐标
# plt.scatter(2, 4)
# 设置坐标并指定点的尺寸
plt.scatter(2, 4, s=200)

# 设置图表标题并给坐标轴加上标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)

# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)

plt.show()
3 月 012021
 
"""
https://matplotlib.org/stable/index.html
Matplotlib: Visualization with Python
Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python.
"""
# 导入模块并指定别名
import matplotlib.pyplot as plt

# 提供输入值,解决x坐标从0开始的问题
input_values = [1, 2, 3, 4, 5]
# 定义平方数列表
square = [1, 4, 9, 16, 25]


# 将列表传递给函数
# plt.plot(square)
# 改善图形可读性,线条加粗
# plt.plot(square, linewidth=5)
# 同时提供输入值列表和输出值列表
plt.plot(input_values, square, linewidth=5)


# 函数title()指定图表标题,参数fontsize指定文字大小
plt.title("Square Numbers", fontsize=24)
# 函数xlable()和ylable()为每条轴设置标题并指定文字大小
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)

# 函数tick_parms()设置刻度样式,并将设置刻度文字大小
# axis n. 轴(旋转物体假想的中心线); (尤指图表中的)固定参考轴线,坐标轴; 对称中心线(将物体平分为二);
plt.tick_params(axis='both', labelsize=14)

# 调用matplotlib查看器,显示绘制的图形
plt.show()