使用Django进行Web的开发
Django
开源的web应用框架,采用MTV的框架模式,推荐进行快速开发。
欢迎Star和Fork我的ETP哦
ETP码云链接
MTV模式
MTV框架模式指的是模型M,视图V和模板T。
M:Model Django使用Model来定义数据库表,并且使用Model来自动生成数据库表,并且Django使用自己的ORM进行数据库操作,与后续是什么数据库并无关系。Django会自动为你生成数据库之间的关联关系,以及数据库的中间表。
T:Template Django使用html来编写Template,用来进行与用户的数据交互。html中使用django定义好的一些标签进行数据的操作。
V:View Django使用View进行数据接收与处理返回。
可以类比MVC框架进行理解。
Django创建工程
django中自带了一些命令,使用django-admin命令可以用来进行工程项目的创建:
django-admin startproject django_web
startproject 用来创建项目 django_web为项目的名称
项目的目录结构
其中 settings.py 是项目的一些配置
urls.py 是项目的路由配置
templates 文件夹用来存放我们编写的template,也就是html文件
Django创建APP
Django对于应用我们使用 manage.py 进行APP的创建
manage.py startapp learning_logs
manage.py 提供了很多与django进行交互的方法,startapp 用来进行APP的创建 learning_logs 就是我们创建的APP的名称。
创建后的目录结构为:
创建完APP之后需要在settings中安装该APP
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bootstrap3',
'learning_logs',
'users',
]
URL文件各个APP管理各自URL
learning_logs/urls.py
from django.urls import path,re_path
from . import views
app_name='learning_logs'
urlpatterns = [
re_path(r'^$',views.index,name='index'),
re_path(r'^topics/$',views.topics,name='topics'),
re_path(r'^topics/(?P<topic_id>\d+)/$',views.topic,name='topic'),
re_path(r'^new_topic/$',views.new_topic,name='new_topic'),
re_path(r'^new_entry/(?P<topic_id>\d+)/$',views.new_entry,name='new_entry'),
re_path(r'^edit_entry/(?P<entry_id>\d+)/$',views.edit_entry,name='edit_entry'),
]
django_web/urls.py
from django.contrib import admin
from django.urls import path,include,re_path
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^learning_logs/', include('learning_logs.urls','learning_logs')),
re_path(r'^users/', include('users.urls','users')),
]
在django_web下的urls.py文件中我们包含了APP下的urls.py,并且给了相应的命名空间
在learning_logs下的urls.py 文件中我们定义了learning_logs APP的url。这样我们就可以进行每个APP管理每个APP的url,否则所有的APP的URL都放到一起会非常多非常难以维护。
用户使用
我们沿用django提供的用户进行我们注册登录注销的开发
首先创建APP users
安装APP users
在djang_web中配置users的urls关联
定义users的请求urls
from django.urls import path,re_path
from django.contrib.auth.views import LoginView
from . import views
app_name='users'
urlpatterns = [
re_path(r'^login/$',LoginView.as_view(template_name='users/login.html'),name='login'),
re_path(r'^logout/$',views.logout_view,name='logout'),
re_path(r'^register/$',views.register,name='register'),
]
我们使用了django自带的登录视图LoginView
创建users/templates/users/login.html 和register.html文件
login.html
{% extends "learning_logs/base.html" %}
{% load bootstrap3 %}
{% block header %}
<h2>Log in to your account</h2>
{% endblock header %}
{% block content %}
{% if form.errors %}
<p>Your username and password didn't match.Please try again.</p>
{% endif %}
<form method="post" action="{% url 'users:login' %}" class="form">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button name="submit" class="btn btn-primary">log in</button>
{% endbuttons %}
<input type="hidden" name="next" value="{% url 'learning_logs:index' %}"/>
</form>
{% endblock content %}
register.html
{% extends "learning_logs/base.html" %}
{% block content %}
<form method="post" action="{% url 'users:register' %}">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">register</button>
<input type="hidden" name="next" value="{% url 'learning_logs:index' %}">
</form>
{% endblock content %}
编写users/views.py的处理逻辑
from django.shortcuts import render
from django.contrib.auth import logout,authenticate,login
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth.forms import UserCreationForm
# Create your views here.
def logout_view(request):
logout(request)
return HttpResponseRedirect(reverse('learning_logs:index'))
def register(request):
if request.method != 'POST':
form = UserCreationForm()
else:
form = UserCreationForm(data=request.POST)
if form.is_valid():
new_user = form.save()
authenticated_user = authenticate(username=new_user.username,password=request.POST['password1'])
login(request,authenticated_user)
return HttpResponseRedirect(reverse('learning_logs:index'))
context = {'form':form}
return render(request,'users/register.html',context)
这里面用到learning_logs配置的base.html我们可以进行html的继承,每次我们不用写那么多的html,哪里需要变动我们就改动哪里就行了。
详细代码参见我上传的资源、
https://download.csdn.net/download/u013302586/11238141
django集成rest_framework
前后端分离,后端只负责处理前端展示的数据。前端究竟怎么渲染完全靠前端处理。在前后端分离的应用模式中,我们通常将后端开发的每一视图都称为一个接口,或者API,前端通过接口来对数据进行增删改查。
resf framework为什么适合django开发restful风格的接口
rest framework有以下特点:
- 提供了定义序列化Serializer的方法,可以快速根据Django ORM或者其他库自动序列化/反序列化
- 提供了丰富的类视图\MIXIN扩展类,简化视图的编写。
- 丰富的定制层级,到自动生成API,满足各种需要
- 函数视图
- 类视图
- 视图结合
- 多种身份认证和权限认证方式的支持
- 内置了限流系统
- 直观的API web界面
- 可扩展性,插件丰富
采用Rest Framework前后会有什么区别
- 多了个Serializers文件
文件的作用是Serializer把querysets和model instance这些复杂的数据结构转化为native python,以便于json,xml或其他内容类型的形式render出去 - 视图的核心功能变了
将数据库数据序列化为前端需要的格式,并且返回
将前端发送过来的数据反序列化为模型类对象,并且保存到数据库中。
创建Rest Framework的Django项目
Django中的概要
概要是一种机器可读文档,用于描述可用的API路径,其URLS以及他们支持的操作。
概要可以是自动生成文档的有用工具,也可以用于驱动可以与API进行交互的动态客户端库。