Django的开发优势
- Django可以自动实现web应用的通用功能,减少程序开发的代码量,不重复造轮子。
- Django可以快速构建高性能、安全、可维护、界面优秀的网站,程序开发人员只需要关注应用程序业务逻辑代码的实现,而不需要重新开发web应用的通用功能。
- Django功能完备,提供了开箱即用的功能,有完善的ORM、强大的路由映射功能、完善的视图模板的实现、强大缓存支持等。
- Django能够自动保护网站,避免许多常见的安全错误。默认情况下,可以防范许多漏洞,包括SQL注入、跨站脚本、CSRF、单击劫持等。
- Django是用python编写的,可以运行在许多操作系统上,可移植性好。
- Django拥有一个Django Admin管理后台,用户几乎不需要写代码就可以拥有一个完整的后台管理页面。
- Django通过表单进行数据验证和处理。
- Django有一个强大的、安全性很高的用户身份验证和权限系统。
- Django可以轻松实现数据序列化,并且支持XML或JSON格式。
MTV设计模式
- MTV设计模式,M是指数据模型Model,T是指模板文件Template,V是指视图函数View以及与它有密切关系的URL配置。
- 模型用来定义数据结构的类,并提供数据库表管理机制,主要用来定义字段名称、类型、默认值等。
from django.db import models
class employee(models.Model):
name = models.CharField(max_length=32, verbose_name='姓名')
email = models.EmailField(verbose_name='邮箱')
- 模板文件一般是HTML格式,用来定义文件的结构或布局,使用占位符表示相关内容,通过视图函数提取数据模型的数据填充HTML文件的占位符,可以动态创建页面。
- 视图函数是用来处理web请求的函数,接收HTTP请求,经过处理后返回HTTP响应。URL配置建立URL与视图函数对应关系,主要是根据浏览器的URL,把HTTP请求重定向到对应的视图函数进行处理。
from django.http import HttpResponse
def hello(request):
return HttpResponse('Hello World!')
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', views.hello),
]
Django的主要文件
- urls.py是进行URL配置的文件,是网址入口,建立URL表达式与视图函数的关系。
- views.py是视图函数存放模块,处理用户发出的请求。
- models.py是数据模型,定义数据表结构,是数据库操作的基础。
- forms.py是表单定义文件,通过表单及字段属性设置,生成页面文本框,对用户提交的进行验证。
- templates文件夹中的文件是模板文件,是视图函数渲染改造的对象,一般是HTML文件。
- admin.py是管理后台配置文件,经过简单的配置代码,就能让数据库数据进行管理。
- settings.py是配置文件,可以设置应用程序模块、数据库类型、中间件等。
- apps.py是应用程序本身的配置文件。
- tests.py是用来编写单元测试代码的文件。
Django开发流程
pip install django
django-admin startproject django_demo
cd django_demo
python manage.py startapp myapp
from django.shortcuts import render
from django.shortcuts import HttpResponse
def index(request):
return HttpResponse('Hello World!
')
def test(request):
hi = '从你的全世界路过'
test = '这是一首简单的小情歌'
return render(request, 'test.html', {'hi': hi, 'test': test})
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
username = request.POST.get('username')
password = request.POST.get('password')
if (username == 'test' and password == '123'):
return redirect('/test/')
else:
return render(request, 'login.html', {'error': '用户名或密码错误!'})
from django.contrib import admin
from django.urls import path
from myapp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
path('test/', views.test),
path('login/', views.login),
]
from django.db import models
class UserInfo(models.Model):
user = models.CharField(max_length=32, verbose_name='姓名')
email = models.EmailField(verbose_name='邮箱')
def __str__(self):
return self.user
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试模板title>
head>
<body>
<div>
<h1>{{ hi }}h1><hr>
<h2>{{ test }}h2>
div>
body>
html>
<!-- 创建登录页面login.html -- >
DOCTYPE html>
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录页面title>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.2.0/css/bootstrap.min.css" rel="stylesheet">
head>
<body>
<div class="container">
<form action="" class="form-signin" method="post">
{% csrf_token %}
<h2 class="form-signin-heading">请登录h2>
<p>p><p>p>
<label for="username" class="sr-only">用户名label>
<input type="text" id="username" name="username" class="form-control" placeholder="用户" required autofocus>
<p>p><p>p>
<label for="password" class="sr-only">密码label>
<input type="password" id="password" name="password" class="form-control" placeholder="密码" required>
<p>p><p>p>
<button class="btn btn-lg btn-primary btn-block" type="submit">登录button>
form>
div>
body>
html>
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '3306',
'NAME': 'myapp',
'USER': 'root',
'PASSWORD': 'root',
}
}
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
import pymysql
pymysql.install_as_MySQLdb()
from django.contrib import admin
from .models import UserInfo
class UserInfoAdmin(admin.ModelAdmin):
list_display = ('user', 'email')
admin.site.register(UserInfo, UserInfoAdmin)
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver