0%

Python-Django

Django

Shell相关

创建项目

1
django-admin startproject mysite

运行服务器

1
2
3
python manage.py runserver
# 运行在指定端口
python manage.py runserver 8080

创建一个新的应用

1
python manage.py startapp myapp

应用结构:

  • _ _ init _ _

  • views:视图函数

  • models:模型

  • admin:后台管理

  • apps:应用配置

  • tests:单元测试

  • migrations:迁移目录

数据库迁移

1
python manage.py migrate

通过models.py生成migrations中的文件

1
python manage.py makemigrations myapp

使用后,一般再执行一遍数据库迁移命令

实现请求与响应

1. 在myapp/models.py下创建模型

1
2
3
4
5
6
7
8
9
10
from django.db import models

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')

class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)

2. 在myapp/views.py下编写视图

  • 视图函数中,第一个参数是request
  • 永远记得返回Response
1
2
3
4
5
6
from django.http import HttpResponse

def index(request):
# 使用模型
# ...
return HttpResponse("Hello wrold")

3. 修改mysite/settings.py,激活模型

1
2
3
4
5
6
7
8
9
10
INSTALLED_APPS = [
# 安装myapp(具体名称在myapp/apps.py中查看)
'myapp.apps.MyappConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

4. 如果需要使用模型,使用shell进行数据库迁移

5. 配置url

5.1 如果是需要综合配置的,则在mysite/urls.py中配置即可

1
2
3
4
5
6
from django.contrib import admin
from django.urls import path

urlpatterns = [
path('admin/', admin.site.urls),
]

5.2 如果是复杂的,则可在mysite/urls.py中配置对应的url文件

  • mysite/urls.py

    1
    2
    3
    4
    5
    6
    7
    from django.contrib import admin
    from django.urls import path, include

    urlpatterns = [
    path('myapp/', include('myapp.urls')),
    path('admin/', admin.site.urls),
    ]
  • myapp/urls.py

    1
    2
    3
    4
    5
    6
    7
    from django.urls import path
    from . import views

    app_name = 'polls'
    urlpatterns = [
    path('', views.index, name='index'),
    ]

对视图返回值进行改良

1. 直接返回HTML内容

1
2
3
4
5
from django.http import HttpResponse

# Create your views here.
def index(request):
return HttpResponse("<h1>Hello</h1>")

2. 使用template模板

2.1 新建myapp/templates/myapp/index.html

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>
Hello world!
</h1>
</body>
</html>

2.2 修改myapp/views.py

1
2
3
4
5
6
7
from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader
# Create your views here.
def index(request):
template = loader.get_template('myapp/index.html')
return HttpResponse(template.render())

3. 使用template模板并传值

3.1 修改myapp/views.py

1
2
3
4
5
6
7
8
9
10
11
from django.http import HttpResponse
from django.template import loader
from myapp.models import Question
# Create your views here.
def index(request):
template = loader.get_template('myapp/index.html')
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {
'latest_question_list': latest_question_list
}
return HttpResponse(template.render(context, request))

可简写

1
2
3
4
5
6
7
8
from django.shortcuts import render
from myapp.models import Question
# Create your views here.
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
return render(request, 'myapp/index.html', {
'latest_question_list': latest_question_list
})

3.2 修改myapp/templates/myapp/index.html,使用传入的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>
Hello world!
</h1>
{% if latest_question_list %}
{% for question in latest_question_list %}
<li>{{ question.question_text }}</li>
{% endfor %}
{% endif %}
</body>
</html>

Model的数据操作

CRUD(在myapp/views.py中)

1. 增加

1
2
3
4
5
6
def add_user(request):
user = User()
user.username = "Tom"
user.age = 20
user.save()
return HttpResponse("Add user")

2. 删除

1
2
3
4
5
def del_user(request):
user = User()
user.id = 1
user.delete()
return HttpResponse("Delete User")

3. 修改

1
2
3
4
5
def mod_user(request):
user = User.objects.get(pk=1)
user.username = 'Jerry' # 修改id为1的username为Jerry
user.save()
return HttpResponse("User modify")

4. 查找

1
2
3
4
# 查找全部
users = User.objects.all()
# 根据id查找
user = User.objects.get(pk=1)

5. 过滤查找

1
users = User.objects.filter(age__gt=10).filter(age__lt=30)

6. 使用聚合函数

1
User.objects.aggregate(Max('age'))

更换数据库为MySQL

1. 新建mysql数据库

2. 修改mysite/settings.py

1
2
3
4
5
6
7
8
9
10
11
12
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DjangoDB',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': 3306,
}
}

3. 安装MySQL驱动

  • mysqlclient
    • python2、python3都能直接使用
    • 缺点:对mysql安装位置有要求,必须指定位置存在配置文件
  • python-mysql
    • python2 支持好,但不支持python3
  • pymysql
    • python2、python3都支持
    • 可伪装成前两个库
  1. 安装

    1
    pip install pymysql
  2. 伪装, 写在mysite/_ _ init _ _.py中

    1
    2
    3
    4
    import pymysql
    # 指定版本
    pymysql.version_info = (1, 4, 13, "final", 0)
    pymysql.install_as_MySQLdb()
  3. 数据库迁移python manage.py migrate