前后端不分离概念:
前后端分离的概念:
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 -p python3 虚拟环境名称
env名称/Scripts/activate
进入虚拟环境, 在linux和mac上使用. 虚拟环境名称/bin/activate
进入虚拟环境deactivate
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 + 回车
可以查看更多命令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[0-9]{4})/$' , views.year_archive)
# Django2.0新语法
path('articles//' , views.year_archive) # 新语法支持url参数的类型转化。例子里的year_archive函数接收到的year参数作为参数,并且会自动转换year为整型而不是字符串。
# 在Django1.x里,我们需要对year做类型转换:
def year_archive(request, year):
year = int(year)
。其中converter
为路径转换器,name
为参数名,如
。对于捕获的值没有路径转换器,那么它会匹配除了斜杠"/"外的所有字符作为捕获的值。
from django.urls import path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles//' , views.year_archive),
path('articles///' , views.month_archive),
path('articles////' , views.article_detail),
]
匹配示例:
默认Path converter, Django2.0自带的PathConveter包括:
from django.http import HttpResponse
def index(request):
return HttpResponse("hello django2!!!")
request.GET.get("name", default)
的形式获取参数值return render(request, template_path, {k:v})
字典中key与value就是要向前端渲染出的数据。语法(内置标签) | 说明 |
---|---|
{% for %} {% endfor %} | 遍历输出的内容 |
{% if %} {% elif %} {% end if %} | 对变量进行条件判断 |
**{% url name args %} ** | 引用路由配置名 |
{% load %} 比如:{% load static %} | 加载django的标签库 |
{% static static_path %} | 读取静态资源 |
{% extends base_template %} | 模板继承 |
{% block data %} {% endblock %} | 重写父模板的代码 |
{% csrf_token %} | 跨域的密钥 |
变量 | 说明 |
---|---|
forloop.counter | 从1开始计算当前索引 |
forloop.counter0 | 从0开始计算获取当前索引 |
forloop.revcounter | 索引从最大数递减到1 |
forloop.revcounter0 | 索引从最大数递减到0 |
forloop.first | 当前元素是否是第一个 |
forloop.last | 当前元素是否是最后一个 |
empty | 为空的情况 |
循环举例:
<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 %}
{% empty %}
is empty
{% endfor %}ul>
<a href="{% url 'index' 'zhengwei' 30 %}">redirecta>
模板中加载静态资源:
{% load static %}
<link rel="stylesheet" href="{% static 'hellowrold.css' %}">
模板继承的方式
{% extends "base.html" %}
{% block name %}
{% endblock %}
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
注意这是一个元组自定义模板过滤器的方法:
1、在项目的应用下创建templatetags包
2、将app.templatetags写入settings中的InstallApp中注册
3、在文件夹下创建myfilter.py文件
4、在myfilter.py文件中定义如下内容
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