Django学习之路
Django搭建
目录
安装Django
pip install Django==3.2.6 #方法一 先确保安装pip,再进行一下操作
sudo apt install python3-django #方法二
查看是否安装成功
>>> import django
>>> django.get_version()
创建Django工程
- 使用django-admin创建一个python web项目。
django-admin startproject xxx
- 创建子应用
python manage.py startapp 子应用名称 #manage.py是创建工程时自动生成的管理文件
3.子应用目录说明
- admin.py 文件跟网站的后台管理站点配置相关。
- apps.py 文件用于配置当前子应用的相关信息。
- migrations 目录用于存放数据库迁移历史文件。
- models.py 文件用户保存数据库模型类。
- tests.py 文件用于开发测试用例,编写单元测试。
- views.py 文件用于编写Web应用视图。
- 启动Django 自带的webserver
cd mydodo_web // 进入我们的工程目录下
python manage.py runserver //启动Django 自带的webserver
会提示 server已经成功启动了,在浏览器中访问http://127.0.0.1:8000应该就会看到显示有“It worded!”的Django的欢迎页面了。
Django import / export实现数据库导入导出
使用django-import-export库,导入导出数据,支持csv、xls、json、html等格式
官网:http://django-import-export.readthedocs.io/en/latest/installation.html
- 安装django-import-export
pip install django-import-export
- 配置settings.py
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'import_export',
)
- 将所有STATICFILES_DIRS中的所有文件夹中的文件及各APP中static中的文件都复制到 静态文件根目录下:STATIC_ROOT
python manage.py collectstatic
- models.py 建立model
class Medical(models.Model):
# Field name made lowercase.
item_no = models.AutoField(db_column='Item_no', primary_key=True)
# Field name made lowercase.
check_date = models.DateField(
db_column='Check_date', blank=True, null=True)
# Field name made lowercase.
hospital = models.CharField(db_column='Hospital', max_length=32)
# Field name made lowercase.
item_cn = models.CharField(db_column='Item_cn', max_length=32)
# Field name made lowercase.
item_en = models.CharField(
db_column='Item_en', max_length=32, blank=True, null=True)
# Field name made lowercase.
check_result = models.FloatField(
db_column='Check_result', blank=True, null=True)
# Field name made lowercase.
unit = models.CharField(
db_column='Unit', max_length=32, blank=True, null=True)
# Field name made lowercase.
reference = models.CharField(
db_column='Reference', max_length=32, blank=True, null=True)
# Field name made lowercase.
normal = models.IntegerField(db_column='Normal', blank=True, null=True)
class Meta:
managed = False
db_table = 'medical'
- 在admin.py 创建Resource、对应的Admin
注意:在admin.py里使用ImportExportModelAdmin,而不是ModelAdmin
class MedicalResource(resources.ModelResource):
class Meta:
model = models.Medical
fields = ('check_date', "hospital", "item_cn", "item_en",
"check_result", "unit", "reference", "normal")
export_order = ('check_date', "hospital", "item_cn",
"item_en", "check_result", "unit", "reference", "normal")
class MedicalAdmin(ImportExportModelAdmin):
list_display = ('check_date', "hospital", "item_cn", "item_en", "check_result", "unit", "reference",
"normal") # 重写属性list_display,来设置展示的表字段
# 重写属性search_fields,把表字段name的值当做搜索条件
search_fields = ('check_date', "hospital", "item_cn", "item_en", "normal")
list_filter = ('check_date', "hospital", "item_cn", "item_en", "normal")
date_hierarchy = 'check_date'
resource_class = MedicalResource
数据库操作
增加数据
#方法1:创建新对象
#类名.objects.create(字段=值,字段=值)
Model_class.objects.create(column1="xxx",
column2="yyy")
#方法2:
m = model_name(column1="xxx",column2="yyy")
m.save()
删除数据
#类名.objects.filter(字段=值).delete()
Model_class.objects.filter(column1="xxx").delete()
查询数据
- 查询单条数据
#类名.objects.get(字段=值)
sql = Model_class.objects.get(column1="xxx")#在查不到不到会报错
password = sql.row1
- 查询多条数据
#类名.objects.filter(字段=值)
sql=Model_class.objects.filter(column1=xxx,column2=yyy)
模型序列化
from django.core import serializers
modle_rest=Model_class.objects.filter(column1=xxx,column2=yyy)
json_data = serializers.serialize('json', modle_rest)
Django默认不支持https
1)以python manage.py runserver启动应用,是不支持https的,报错如下错误:
You’re accessing the development server over HTTPS, but it only supports HTTP
2)settings.py中设置SECURE_SSL_REDIRECT = True此时,http请求自动跳转到https,http此时django能正确访问。如果直接请求HTTPS时会报错如下错误:
You’re accessing the development server over HTTPS, but it only supports HTTP.
Django安装sslserver以支持https
- 安装sslserver插件
pip install django-sslserver
- 在settings.py中添加配置
INSTALLED_APPS = (
...
"sslserver",
...
)
- 自带证书启动django应用
python manage.py runsslserver
- 指定证书启动django应用
python manage.py runsslserver --certificate /path/to/certificate.crt --key /path/to/key.key 0.0.0.0:8000
模块
- import_export
- django-sslserver
- django-werkzeug-debugger-runserver
- django_extensions
- flask
- pymysql
命令
Django migrate
1. 初始化app models 表:python manage.py makemigrations (所有模型)
2. 初始化app 某个模块:python manage.py makemigrations app_name
3. 迁移升级表:python manage.py migrate
4. 迁移某个app: python manage.py migrate app_name
5. 查看迁移文件的执行状态,可以用showmigrations命令查看:python manage.py showmigrations admin
6. 指定迁移表变化名字:python manage.py makemigrations user --name "team_region"
静态文件
- 创建static文件
- 在settings.py文件中添加STATIC_URL = 'static/'
操作MySQL
- 在Django的settings.py文件中设置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'xxx', # 数据库名,先前创建的
'USER': 'root', # 用户名,可以自己创建用户
'PASSWORD': '****', # 密码
'HOST': '127.0.0.1', # mysql服务所在的主机ip
'PORT': '3306', # mysql服务端口
}
}
- 运行python manage.py createsuperuser 命令来创建一个管理员账户
- 在admin.py中将Model注册到管理后台
定时任务
django-crontab
- 安装django-crontab插件
pip3 install django-crontab
'''
- 在settings.pyINSTALLED_APPS 注册APP
INSTALLED_APPS = [
...
'django_crontab'
]
- django_crontab格式
* * * * * :分别表示 分(0-59)、时(0-23)、天(1 - 31)、月(1 - 12) 、周(星期中星期几 (0 - 7) (0 7 均为周天))
crontab范例:
每五分钟执行 */5 * * * *
每小时执行 0 * * * *
每天执行 0 0 * * *
每周一执行 0 0 * * 1
每月执行 0 0 1 * *
每天23点执行 0 23 * * *
'''
CRONJOBS = [
('*/1 * * * *', 'base.crontabs.confdict_handle', ' >> /tmp/logs/confdict_handle.log'), # 注意:/tmp/base_api 目录要手动创建
]
继承
- html
子模板只能修改父模板中定义的block
父模板
{% block par_block_name %}
...
{% endblock %}
子模板
<-- 声明继承的父模板 -->
{% block par_block_name %}
...
{% endblock %}
中间件
- 在manage.py同级目录下新建中间件目录(如:middleware)
- 在settings.py MIDDLEWARE 中注册中间件
问题报错
django ModuleNotFoundError: No module named 'xxx.urls'
解决方法:查看urls.py文件是否存在,或者路径是否正确
CSRF验证失败. 请求被中断
解决方法:待解决
错误:MultipleObjectsReturned
解决方法:
使用过滤器
from django.core.exceptions import MultipleObjectsReturned
...
try:
model_name.objects.get(column_name='xxx')
except MultipleObjectsReturned:
model_name.objects.filter(column_name='xxx').first()
html 引用css、js等静态文件加载不成功
解决方法:
- 在setting.py中添加以下代码:
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
STATICFILES_DIRS = (
('js', os.path.join(STATIC_ROOT, 'js')),
('css', os.path.join(STATIC_ROOT, 'css')),
('img', os.path.join(STATIC_ROOT, 'img')),
)
- 引用时按照以下格式:
<link rel="stylesheet" type="text/css" href="static/css/mydodo.css">
<script type="text/javascript" src="static/js/mydodo.js"></script>
- 若修改了css等不生效的话,执行:
python manage.py collectstatic