文章目录
配置相关
python 3.7、mySQL的适配问题
官网上这里没写的太清楚,解决办法如下:
- 通过pip下载pymysql
pip install pymysql
- 在项目根目录下 init.py 文件中添加以下代码
import pymysql
pymysql.install_as_MySQLdb()
跨站点请求伪造保护
在任何使用POST表单的模板中,如果表单用于内部URL,请使用元素csrf_token内的标记,例如:
<form method="post">{% csrf_token %}
对于以外部URL为目标的POST表单,不应该这样做,因为这会导致CSRF令牌泄露,从而导致漏洞。
PYTHON代码vim快速注释和删除
两种方法:
CTRL+V
进入列选择模式,选择其中的#
,然后按d进行删除。- 可以利用
:首行,尾行s/^/#/g
进行注释,利用:首行,尾行s/^#//g
进行反注释。
Django的基础使用
Django的工程生成
在某个目录下,如果想要创建mysite工程,则在CMD下运行
$ django-admin startproject mysite
运行工程
检测项目是否创建成功
$ python manage.py runserver
在工程中创建一个应用
在mysite下创建一个polls应用
$ python manage.py startapp polls
如果要应用我们新建的应用,则应该在应用polls的目录polls/urls.py
中,输入如下代码
from django.urls import path
from . import views
urlpatterns=[
path('',views.index,name='index'),
]
并在工程的根目录下urls.py
文件添加对这个应用的引用
from django.contrib import admin
from django.urls import include, path
urlpatterns=[
path('polls/',include('polls.urls')),
path('admin/',admin.site.urls),
]
include 函数,就是将完整的python路径导入到另一个urlconf模块,该模块应该“包含”在这个地方。
admin模块是管理模块,不需要include。
path的四个参数
函数 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 模式。
Django数据库相关
数据库配置
mysite/settings.py
这是个包含了 Django 项目设置的 Python 模块。
通常,这个配置文件使用 SQLite 作为默认数据库。Python 内置 SQLite,所以你无需安装额外东西来使用它。当你开始一个真正的项目时,你可能更倾向使用一个更具扩展性的数据库,避免中途切换数据库这个令人头疼的问题。
如果你想使用其他数据库,你需要安装合适的 database bindings ,然后改变设置文件中 DATABASES ‘default’ 项目中的一些键值:
ENGINE
– 可选值有 ‘django.db.backends.sqlite3’,‘django.db.backends.postgresql’,‘django.db.backends.mysql’,或 'django.db.backends.oracle’以及其它可用后端。
NAME
- 数据库的名称。如果使用的是 SQLite,数据库将是你电脑上的一个文件,在这种情况下, NAME 应该是此文件的绝对路径,包括文件名。默认值 os.path.join(BASE_DIR, ‘db.sqlite3’) 将会把数据库文件储存在项目的根目录。
如果你不使用 SQLite,则必须添加一些额外设置,比如 USER 、 PASSWORD 、 HOST 等等。
在使用前,应先编辑mysite/setting.py
的TIME_ZONE为自己的时区。
在Django的配置文件settings.py中,有两个配置参数是跟时间与时区有关的,分别是TIME_ZONE和USE_TZ。
如果USE_TZ设置为True时,Django会使用系统默认设置的时区,即America/Chicago,此时的TIME_ZONE不管有没有设置都不起作用。
如果USE_TZ 设置为False,而TIME_ZONE设置为None,则Django还是会使用默认的America/Chicago时间。若TIME_ZONE设置为其它时区的话,则还要分情况,如果是Windows系统,则TIME_ZONE设置是没用的,Django会使用本机的时间。如果为其他系统,则使用该时区的时间,入设置USE_TZ = False, TIME_ZONE = ‘Asia/Shanghai’, 则使用上海的UTC时间。
——此处感谢CSDN @brad1994
Django的默认安装项
INSTALLED_APPS 默认包括了以下 Django 的自带应用:
- django.contrib.admin – 管理员站点, 你很快就会使用它。
- django.contrib.auth – 认证授权系统。
- django.contrib.contenttypes – 内容类型框架。
- django.contrib.sessions – 会话框架。
- django.contrib.messages – 消息框架。
- django.contrib.staticfiles – 管理静态文件的框架。
这些应用被默认启用是为了给常规项目提供方便。
默认开启的某些应用需要至少一个数据表,所以,在使用他们之前需要在数据库中创建一些表。请执行以下命令
python manage.py migrate
这个 migrate 命令检查 INSTALLED_APPS 设置,为其中的每个应用创建需要的数据表,至于具体会创建什么,这取决于你的 mysite/settings.py 设置文件和每个应用的数据库迁移文件。这个命令所执行的每个迁移操作都会在终端中显示出来。
模型
定义模型
每个模型都是一个python类,这些类继承django.db.models.Model
. 模型类的每一个属性都相当于一个数据表的字段,Django自动生成访问数据库的API.
例如,定义一个person
from django.db import models
class Person(models.Model):
firest_name= models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
上面的模型会自动建立如下的表:
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
使用模型
定义过后,需要告诉Django需要使用这类的模型.需要修改设置文件中的INSTALLED_APPS,在这个设置中添加包含models.py文件的名字. 例如,如果模型位于项目中的"myapp.models"中,设置应该如下:
INSTALLED_APPS = [
#....
'myapp',
#.....
]
在添加后,应运行
python manage.py migrate
进行移植更新.
字段
模型中最重要的、并且也是唯一必须的是数据库的字段定义。字段在类中定义。定义字段名时应小心避免使用与 models API</ref/models/instances>
冲突的名称, 如 clean
, save
, or delete
等.
from django.db import models
class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
instrument = models.CharField(max_length=100)
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
release_date = models.DateField()
num_stars = models.IntegerField()
模型的每一个字段都是一个Field类的实例,每个字段都有特定的参数,例如CharField就需要max_length参数.
常用的Field选项还有以下几个:
- blank: 如果是True,则字段允许为空,默认是False.
- choice: 是一个二元列表,列表第一列存储到数据库中,第二列用于显示.例如
YEAR_IN_SCHOOL_CHOICES = (
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
)
对应的Choice可以用get_F00_display()
获得第二列的内容. F00
就是定义的Choice的实例的名字. 该方法是继承于model类的.
from django.db import models
class Person(models.Model):
SHIRT_SIZES = (
('S', 'Small'),
('M', 'Medium'),
('L', 'Large'),
)
name = models.CharField(max_length=60)
shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
- primary-key: 主键,如果被定义,则系统默认的主键ID就没有了. 主键是readonly的,如果主键更改了,则系统会生成一个新的记录.
from django.db import models
class Fruit(models.Model):
name = models.CharField(max_length=100, primary_key=True)
>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
<QuerySet ['Apple', 'Pear']>
- unique: 如果是True,则该属性就不能有相同的.
外键
class ForeignKey(to, on_delete, **options)[source]
on_delelte属性如下:
- CASCADE: 模拟SQL的CASCADE,将包含外键的对象一起删除.
- PROTECT: 阻止删除, 引发ProtectedError.
- SET_NULL: 将外键设置成null.
- SET_DEFAULT: 将外键设置成default值.
- SET(): 将外键设置成Set().
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models
def get_sentinel_user():
return get_user_model().objects.get_or_create(username='deleted')[0]
class MyModel(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET(get_sentinel_user),
)
- DO_NOTHING: 什么也不做
如果引用一个还没有定义的关系,可以用模型名字来替代模型的对象.
from django.db import models
class Car(models.Model):
manufacturer = models.ForeignKey(
'Manufacturer',
on_delete=models.CASCADE,
)
# ...
class Manufacturer(models.Model):
# ...
pass
激活模型
Django可以创建数据库,创建可以与数据库交互的API,但是首先要安装, 迁移, 激活.
安装: 在INSTALLED_APPS中添加设置.因为PollsConfig类卸载文件polls/apps.py中,引入点式路径的名字是’polls.apps.PollsConfig’
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
然后运行
$ python manage.py makemigrations polls
Django会检测你对模型的修改,并且把修改的部分存储为一次迁移.输出类似如下的信息:
Migrations for 'polls':
polls/migrations/0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice
$ python manage.py sqlmigrate polls 0001
可以输出迁移的SQl的信息.
再次运行migrate,可以在数据库里创建新的数据表.
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK