前后端不分离,前后端分离
前后端不分离概念:
- 前后端不分离,那么前端的看到的效果完全由后端控制,由后端渲染页面后者进行重定向,也就是说后端需要控制前端的展示,前端、后端的耦合度很高。
前后端分离的概念:
- 前后端分离的应用模式中,后端只返回前端需要的数据,不在渲染html页面,也不在控制前端的效果,至于前端看到什么样的效果,取决于前端。
django中的模块
- 模型model:数据层,处理与数据相关的所有事物
- 视图view: 视图层,用来处理用户发出的请求
- 模板template:模板,通过视图函数渲染html模板,得到动态的前端页面
- 路由url:网站的入口,关联到对应的视图函数,访问网址就对应一个函数
- 表单forms:表单,用在浏览器输入数据提交,并对这些数据进行验证
- 后台admin:django自带一个管理后台,对你提交的数据进行管理
- 配置settings:django的设置,配置文件
django中的settings配置文件的说明
ALLOWED_HOSTS = ["*"] :
用来限制能够访问项目的ip地址,如果设置为“*”的话,就意味着所有的ip地址都能够访问,其主要就是为了防止黑客攻击的。INSTALLED_APPS = ["django.contrib.admin",]:
凡是我们自己定义的应用,都需要进行安装,如果是django2.0版本以上的,可以直接用app的名字如INSTALLED_APPS=["app”]
,如果是django1.0版本的使用INSTALLED_APPS=["users.apps.UsersConfig'”]
ROOT_URLCONF = 'django_learning.urls':
设置根路由的位置WSGI_APPLICATION = 'django_learning.wsgi.application':
指定wsgi应用的位置AUTH_PASSWORD_VALIDATORS :
用来做密码验证,比如我们通过python manager createsuperuser
时设置的密码。
virtualenv
- virtualenv是一个Python的虚拟环境库,通过它可以防止各个项目之间因为Python版本不同或第三方版本不同引起冲突,每个虚拟环境都是独立,干净的。
- 创建虚拟环境:
virtualenv -p python3 虚拟环境名称
- 启动虚拟环境:在 windows上使用
env名称/Scripts/activate
进入虚拟环境, 在linux和mac上使用. 虚拟环境名称/bin/activate
进入虚拟环境 - 退出虚拟环境:
deactivate
django的基础命令
django-admin startproject 项目名
:创建一个django项目python manage.py startapp 应用名
:创建一个应用python manage.py shell
: 进入调试代码的调试模式python manage.py makemigrations
:数据库创建更改文件python manage.py migrate
: 同步到数据库进行更新python manage.py flush
: 清空数据库python manage.py runserver 0.0.0.0:8000
: 启动开发服务器,因为开发服务器是单进程的,承受不了高并发python manage.py + 回车
可以查看更多命令
路由常用方法,变量与views的绑定
path函数:path(uri, 视图函数, name=“路由名称”)将视图函数与ur l进行绑定,注意这个别名可以在重定向和模板定义的时候直接用别名替代
。
from django.urls import path, include
from django.contrib import admin
path("admin/", admin.site.urls) # 设置admin的url,admin/代表uri的地址,后面的/代表路径分隔符,admin.site.urls是url对应的视图函数
path("", include("app.urls") # include的是将应用中的urls全部包含进来
# 上面的写法也可以使用下面的代替
from app import urls as app_urls
path("", include(app_urls) # 注意这种方法需要将urls模块起个别名,因为不同应用都有url模块
示例:
path函数与url函数的区别:
在Django2.0其中一个新特性为:简化Url路由的语法。在代码上主要体现在新增了django.urls.path函数,它带来了更简洁、更可读的路由语法,如:
# 原来的url
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive)
# Django2.0新语法
path('articles/<int:year>/', views.year_archive) # 新语法支持url参数的类型转化。例子里的year_archive函数接收到的year参数作为参数,并且会自动转换year为整型而不是字符串。
# 在Django1.x里,我们需要对year做类型转换:
def year_archive(request, year):
year = int(year)
- URL参数捕获,在新的语法里,url字符串有以下规则:
- 在url里使用尖括号“<>”来捕获值
- 尖括号捕获值的格式
<converter:name>
。其中converter
为路径转换器,name
为参数名,如<int:year>
。对于捕获的值没有路径转换器,那么它会匹配除了斜杠"/"外的所有字符作为捕获的值。 - url不需要以斜杠开头。
代码示例:
from django.urls import path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
匹配示例:
- /articles/2005/03/:匹配到第3个规则,调用views.month_archive(request, year=2005, month=3)
- /articles/2003/:匹配到第1个规则,调用views.special_case_2003(request)
- /articles/2003:没有匹配到规则,原因是所有的规则都是以斜杠结尾
- /articles/2003/03/building-a-django-site/:匹配到第4个规则,调用views.article_detail(request, year=2003, month=3, slug=”building-a-django-site”)url里捕获的值使用Path Converter来对值做转换,如类型转换。Django2.0自带了默人的Path Converter,同时也支持自定义Path Conveter。
默认Path converter, Django2.0自带的PathConveter包括:
- str:匹配除了路径分隔符(/)之外的非空字符串,如果没有转换器,默认使用str作为转换器。
- int:匹配0及正整数。
- slug:匹配字母、数字以及横杠、下划线组成的字符串。
- uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
- path:匹配任何非空字符串,包含了路径分隔符(/)
示例:
视图的基本写法
from django.http import HttpResponse
def index(request):
return HttpResponse("hello django2!!!")
视图读取参数
- url以查询字符串的方式传参,使用
request.GET.get("name", default)
的形式获取参数值 - url以路径传参,使用路径转换器来进行获取参数,在django1.0版本的时候只能通过正则表达式来获取参数。
request对象的方法
- request.GET:获取url中的查询字符串的数据
- request.POST: 获取表单提交的数据
- request.path:获取请求的路径
- request.method:获取请求的方法get or post
- request.COOKIES:获取请求过来的cookies
- request.user:获取请求的用户对象,可以通过它判断用户是否登录,并获取用户信息
- request.session:一个既可读又可写的类似字典的对象,表示当前会话
- request.META:一个标准的Python字典,包含所有的HTTP首部。具体的头部信息取决于客户端和服务器
视图函数的常用的返回对戏那个
- HttpResponse对象,可以直接返回一些字符窜
- render: 将数据在模板中渲染并显示,使用方式为
return render(request, template_path, {k:v})
字典中key与value就是要向前端渲染出的数据。 - JsonResponse返回一个json类型,通常用于与前端进行ajax交互
jinja2的模板语法
语法(内置标签) | 说明 |
---|---|
{% for %} {% endfor %} | 遍历输出的内容 |
{% if %} {% elif %} {% end if %} | 对变量进行条件判断 |
**{% url name args %} ** | 引用路由配置名 |
{% load %} 比如:{% load static %} | 加载django的标签库 |
{% static static_path %} | 读取静态资源 |
{% extends base_template %} | 模板继承 |
{% block data %} {% endblock %} | 重写父模板的代码 |
{% csrf_token %} | 跨域的密钥 |
for标签中的语法
变量 | 说明 |
---|---|
forloop.counter | 从1开始计算当前索引 |
forloop.counter0 | 从0开始计算获取当前索引 |
forloop.revcounter | 索引从最大数递减到1 |
forloop.revcounter0 | 索引从最大数递减到0 |
forloop.first | 当前元素是否是第一个 |
forloop.last | 当前元素是否是最后一个 |
empty | 为空的情况 |
循环举例:
<!--本例中的range_list=range(10)-->
<ul>
{% for i in range_list %}
{% if not forloop.first and not forloop.last %}
<li> 第{{i}}次循环:{{i}}---forloop.counter:{{forloop.counter}}---forloop.counter0:{{forloop.counter0}}---forloop.revcounter0:{{forloop.revcounter0}}---forloop.revcounter:{{forloop.revcounter}}</li>
{% elif forloop.first or forloop.last %}
<li>{{i}}---forloop.counter:{{forloop.counter}}---forloop.counter0:{{forloop.counter0}}---forloop.revcounter0:{{forloop.revcounter0}}---forloop.revcounter:{{forloop.revcounter}}</li>
{% endif %}
<!--如果range_list为空的话,那么就会走下面这个逻辑, -->
{% empty %}
is empty
{% endfor %}</ul>
浏览器中的显示效果:
模板中引用某个路由的方式:
<!--这样在模板中就可以得到name="index"的路径(path("<str:name>/<int:age>,视图函数,name="index")),并且提供参数为"zhangsan"和30-->
<!--如果name="index"路径为"127.0.0.1:8000/lisi/20, 那么在这里得到的herf属性就是"127.0.0.1:8000/zhangsan/30-->
<a href="{% url 'index' 'zhengwei' 30 %}">redirect</a>
模板中加载静态资源:
<!--在模板中引入css文件-->
{% load static %}
<link rel="stylesheet" href="{% static 'hellowrold.css' %}">
模板继承的方式
<!--继承模板-->
{% extends "base.html" %}
<!--给模板挖坑-->
{% block name %}
{% endblock %}
静态文件的配置
- 在项目根目录创建“static" 与 ”templates“ 文件夹同级
- 在配置文件settings中添加
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
注意这是一个元组 - 静态文件的种类有:css文件,js文件,图片
django自带的模板过滤器以及如何自定义模板过滤器
-
自定义模板过滤器的方法:
1、在项目的应用下创建templatetags包
2、将app.templatetags写入settings中的InstallApp中注册
3、在文件夹下创建myfilter.py文件
4、在myfilter.py文件中定义如下内容
-
django自带过滤器说明:
django2.0中如何配置jinja2模板引擎
1、安装Jinja2扩展包:pip install Jinja2
2、在django的配置文件settings中配置Jinja2模板引擎
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2', # jinja2模板引擎
'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',
],
},
},
]
3、补充Jinja2模板引擎环境
3.1.Jinja2创建模板引擎环境配置文件
3.2.编写Jinja2创建模板引擎环境配置代码
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
from jinja2 import Environment
def jinja2_environment(**options):
env = Environment(**options)
env.globals.update({
'static': staticfiles_storage.url,
'url': reverse,
})
return env
4、在settings文件中补充Jinja2模板引擎环境
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2', # jinja2模板引擎
'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',
],
# 补充Jinja2模板引擎环境
'environment': 'utils.jinja2_env.jinja2_environment',
},
},
]
如果我们想要自定义jinja2的模板过滤器的话,按照下面的步骤:
1、utils下创建文件myfilter.py,内容如下:
def test(value, scale):
return value * scale
2、在jinja2_env.py中添加如下代码:
from utils import test
env.filters["test"] = test