Akemi

Python-Django框架入门学习

2025/01/17

Django 是一个开源的 Python Web 框架,旨在帮助开发者快速创建高效、可扩展的 Web 应用。

安装django: pip install django

创建django项目: django-admin startproject myproject

启动服务器: python .\manage.py runserver

文件作用:
根目录/manae.py 项目的管理脚本 如启动服务器runserver 数据库迁移migrate 创建管理员账号createsuperuser 如启动python manage.py runserver

init.py 空文件, 子目录可以作为模块导入

settings.py 核心配置文件,包括 数据库配置 已安装的应用 中间件 模板路径

urls.py 定义项目的URL路由 决定了用户访问某个URL时应该调用哪个视图

asgi.py/wsgi.py 一个是异步服务器接口,一个是同步服务器接口

子应用路由转发逻辑

创建一个子应用
python manage.py startapp myapp

子应用路由转发逻辑

首先是根目录下/urls.py定义根的转发方式

路由——子路由——视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from django.contrib import admin
from django.urls import path,include

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

定义一个根的转发,转发到myapps的路由文件中

from django.urls import path
# 导入home这个函数
from .views import home

# path用来定义路由,访问''时即访问根路径
urlpatterns = [
path('',home,name='home')
]
# 如果想要定义到about,就是
# path('about',home)
# http://localhost:8080/about
# {% urlpattern %}

转发到home这个视图下,位于views.py

from django.http import HttpResponse
# home视图函数
def home(request):
return HttpResponse('hello,django')

那么现在访问根目录 出来的就是hello,django

使用ORM模型

ORM是对象关系映射模型 使用python类来定义数据表

django中每个模型通常对应数据库中的一个表 每个属性对应表中的一列

数据库迁移

生成迁移文件 python manage.py makemigrations

数据库迁移(应用迁移)python manage.py migrate

数据库迁移并不是运维讲的数据库迁移 而是更新数据库的意思

当模型定义发生变化时(如添加新字段),Django通过迁移机制来更新数据库表结构。开发者首先使用python manage.py makemigrations命令生成迁移文件,然后使用python manage.py migrate命令应用这些迁移,从而更新数据库。

定义一个模型

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

# 在这里定义一个模型,也就是数据库的表
# 从models.Model中继承
class Article(models.Model):
title = models.CharField(max_length=100) # 存放标题
content = models.TextField() # 存放内容
created_at = models.DateTimeField(auto_now_add=True) # 文章创建时间

def __str__(self):
return self.title

生成一个表

1
2
python manage.py makemigrations
python manage.py migrate

往数据库中添加数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
py .\manage.py shell
>>> from myapp.models import Article
>>> article=Article(title='First Article',content='this is content')
实例化一条数据article

>>> article.save()
保存到数据库中

>>> article=Article(title='Sencend Article',content='this is content')
>>> article.save()

调用article.objects.all()方法查看
>>> articles=Article.objects.all()
>>> for article in articles:
... print(article.title)
...
First Article
Sencend Article

视图——渲染模板

在路由到视图时,视图可以选择多种方式进行实现,如
1.基于模板引擎来渲染html
2.直接返回HTML字符串
3.返回json数据
4.重定向到另一个url
5.处理表单提交

前面我们直接返回的是一个字符串

这里我们来使用模板进行渲染

创建模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My Articles</title>
</head>
<body>
<h1>Articles</h1>
<!--这段是从ORM数据库里传送来的数据-->
<ul>
{% for article in articles %}
<li>{{ article.title }}</li>
{% endfor %}
</ul>
</body>
</html>

修改视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#coding=UTF-8
from django.shortcuts import render
from django.http import HttpResponse
from .models import Article
# 导入article类

# home视图函数
def home(request):
#return HttpResponse('hello,django')
Articles=Article.objects.all()
return render(request,'home.html', {'articles':Articles})
'''
render是django提供的快捷渲染函数
request是传入的请求
'home.html'要渲染的html文件
{'article'}字典,让html的article值为遍历的articles值
'''

创建与处理表单

分4步

1.创建一个表单类,来处理某种类型的表单请求

2.创建一个新的视图,来获取提交上来的POST请求,并做出处理

3.定义路由,指向新的视图

4.写一个html,用以提交表单

创建表单类

1
2
3
4
5
6
7
8
9
创建forms.py

from django import forms
# 创建一个表单类,来处理用户输入
class ArticleForm(forms.Form): # django表单类
# 生成表单元素title和content
title = forms.CharField(label='Title',max_length=100)
# textarea多行文本框
content = forms.CharField(label='Content',widget=forms.Textarea)

创建新视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
在views.py中添加

def create_article(request):
# 请求方法为POST时触发
if request.method == 'POST':
# 将获得的form,通过刚刚定义的类进行实例化
form = ArticleForm(request.POST)
# 如果表单数据合法
if form.is_valid():
# 表单数据验证和清理
title = form.cleaned_data['title']
content = form.cleaned_data['content']
# 使用清洗过的数据创建表单
Article.objects.create(title=title,content=content)
# 添加完成后,重定向到home视图
return redirect('home')
else: # 如果不是POST
form = ArticleForm()
return render(request,'create_article.html',{'form':form})

定义新路由

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

urlpatterns = [
path('',home,name='home'),
path('create/',create_article,name='create')
]

创建带表单的html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Create new Article</title>
</head>
<body>
<h1>Create new Article</h1>
<form method="post">
{% csrf_token %} <!--模板标签,跨站请求伪造保护令牌-->
{{ form.as_p }} <!--渲染Django表单form,并封装在p中-->
<button type="sumbit">Submit</button>
</form>
</body>
</html>

用户注册

1.添加用户注册视图,从表单中获取账号密码,并对数据库进行操作

2.添加到达用户注册视图的路由

3.写提供用户注册表单的html

添加视图

1
2
3
4
5
6
7
8
9
10
11
12
定义一个新函数进行注册
def register(request):
if request.method == 'POST':
# 从request中获取账号密码数据
username = request.POST['username']
password = request.POST['password']
# 和数据库交互,进行用户的添加
user = User.objects.create_user(username=username,password=password)
# 重定向到首页
return redirect('home')
# 如果不是POST,就渲染注册页面
return render(request,'register.html')

添加路由

1
2
3
4
5
6
7
8
9
10
11
from django.urls import path
# 导入定义好的函数
from .views import home,create_article
from .views import register

# path用来定义路由,访问''时即访问根路径
urlpatterns = [
path('',home,name='home'),
path('create/',create_article,name='create'),
path('register/',register,name='register')
]

创建register的html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
<h1>Register</h1>
<form method="post">
{% csrf_token %}
<label for="username">Username:</label>
<input type="text" name="username" required> <!--用户名输出框-->
<label for="password">Password:</label>
<input type="password" name="password" required>
<button type="submit">Register</button>
</form>
</body>
</html>

用户登录

步骤与用户注册相同

1.写一个负责login的视图函数,函数中进行账号密码验证,并将通过的标记为已

2.定义新的路由,指向login视图

3.写login的html

user_login视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def user_login(request):
if request.method == 'POST':
# 从request中获取账号密码
username = request.POST['username']
password = request.POST['password']
# 调用authenticate函数进行用户认证,如果成功会返回一个用户对象
user = authenticate(request,username=username,password=password)
if user is not None:
# 调用login函数在当前会话中标记用户为已登录
login(request,user)
# 如果成功则返回到home
return redirect('home')
# 如果不是POST请求或认证失败,则返回登录界面,并进行渲染
return render(request,'login.html')

login路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.urls import path
# 导入定义好的函数
from .views import home,create_article
from .views import register
from .views import user_login

# path用来定义路由,访问''时即访问根路径
urlpatterns = [
path('',home,name='home'),
path('create/',create_article,name='create'),
path('register/',register,name='register'),
path('login/',user_login,name='user_login')
]

写一个login.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>user_login</title>
</head>
<body>
<h1>User_login</h1>
<form method="post">
{% csrf_token %}
<label for="username">Username:</label>
<input type="text" name="username" required>
<label for="password">Password:</label>
<input type="password" name="password" required>
<button type="submit">Login</button>
</form>
</body>
</html>

CATALOG
  1. 1. 子应用路由转发逻辑
    1. 1.1. 子应用路由转发逻辑
  2. 2. 使用ORM模型
    1. 2.1. 数据库迁移
    2. 2.2. 定义一个模型
    3. 2.3. 生成一个表
    4. 2.4. 往数据库中添加数据
  3. 3. 视图——渲染模板
  4. 4. 创建与处理表单
    1. 4.1. 创建表单类
    2. 4.2. 创建新视图
    3. 4.3. 定义新路由
    4. 4.4. 创建带表单的html
  5. 5. 用户注册
    1. 5.1. 添加视图
    2. 5.2. 添加路由
    3. 5.3. 创建register的html
  6. 6. 用户登录
    1. 6.1. user_login视图
    2. 6.2. login路由
    3. 6.3. 写一个login.html