django安装
pip install django==2.2.16
新建项目
django-admin startproject dj01
创建应用
python manage.py startapp app01 # cd 至 manage.py 目录下
在settings.py中注册app
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
]
设置允许访问
ALLOWED_HOSTS = ['*']
设置静态文件夹
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static_files'),
]
工程目录下创建静态文件夹 static_files
DEBUG 模式关闭后需要自己设置静态文件路由
1. 首先修改App setting.py文件
STATIC_URL = '/static/'
STATIC_ROOT = 'static' ## 新增行
STATICFILES_DIRS = [
os.path.join(BASE_DIR, '/static/'), ##修改地方
]
2. 修改urls.py
from django.views import static ##新增
from django.conf import settings ##新增
from django.conf.urls import url ##新增
urlpatterns = [
path('', include('user.urls')),
## 以下是新增
url(r'^static/(?P<path>.*)$', static.serve,
{'document_root': settings.STATIC_ROOT}, name='static'),
]
设置子路由
- 在应用目录下创建文件urls.py
from app01 import views
from django.urls import path
urlpatterns = [
path('mydjango/', views.index),
]
- 在项目目录dj01下的urls中添加子路由配置
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls), #admin后台
path('app01/', include('app01.urls'))
]
反解析
通过视图命名找视图的路由地址
修改dj01目录下的urls文件
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls), #admin后台
path('app01/', include(('app01.urls','app01'),namespace='app')),
]
修改app01中urls文件
from app01 import views
from django.urls import path
urlpatterns = [
# path('admin/', admin.site.urls), #admin后台
path('mydjango/', views.index, name='mdj'),
]
修改app01下views文件
from django.http import HttpResponse
from django.shortcuts import render
from django.urls import reverse
def index(request):
"index视图函数"
r = reverse('app:mdj') # 命名空间:路由名称
print(r)
return HttpResponse("hello this is my django")
路由的正则匹配
from app01 import views
from django.urls import path
urlpatterns = [
# path('admin/', admin.site.urls), #admin后台
re_path(r'^mydjango/$', views.index, name='mdj'), # 将path改为re_path即可写正则表达式
]
重定向
修改app01 views文件
from django.shortcuts import render, redirect
def index_redirect(request):
# return redirect('app:mdj') # 按名称指定跳转路由
# return redirect('https://www.baidu.com/') # 跳转到其它网站
return redirect('/app01/mydjango/')
获取请求参数
从路由中获取参数
views文件中新增函数
def weather(request, city, year):
return HttpResponse(f'city:{city}\nyear:{year}')
urls文件中新增路由
from app01 import views
from django.urls import path,re_path
urlpatterns = [
# path('admin/', admin.site.urls), #admin后台
path('mydjango/', views.index, name='mdj'),
path('myredirect/', views.index_redirect, name='redirect'),
#re_path(r'weather/(\w+)/(\d+)/$', views.weather),
re_path(r''weather/(?P<city>\w+)/(?P<year>\d+)/) # 新增
]
获取查询字符串
views文件中添加函数
def query(request):
data = request.GET
a = data.get('a')
# a = data.getlist('a')
b = data.get('b')
return HttpResponse(f'a:{a} b:{b}')
urls 文件中新增路由
path('q', views.query)
获取请求体数据
获取表单数据
def post_data(request):
if request.method == 'POST':
a = request.POST.get('a')
a_list = request.POST.getlist('a')
b = request.POST.get('b')
print('a', a)
print('a_list', a_list)
print('b', b)
return HttpResponse('提交数据')
else:
return HttpResponse('提交数据失败!')
获取非表单数据
views文件中添加
def get_body(request):
if request.method == "POST":
json_bytes = request.body # 获取请求的二进制数据
json_str = json_bytes.decode()
data = json.loads(json_str)
return HttpResponse(f'data:{data}')
添加路由
path('p_json/', views.get_body),
获取请求头
def get_headers(request):
headers = request.META
print(headers)
return HttpResponse('ok')
响应对象
def http(request):
data = <h1>标题</h1>
return HttpResponse(content=data, content_type=响应数据类型, status=状态码)
设置cookie
def cookieview(request):
rs = HttpResponse('ok')
rs.set_cookie('name','this is a cookie') # 浏览器关闭自动清空cookie
rs.set_cookie('age','20', max_age=3600*2) # 设置2h后失效,浏览器关闭后不会自动清空
return rs
读取cookie
def readcookie(request):
name = request.COOKIES.get('name')
print(name)
return HttpResponse('cookie读取成功')
设置session
项目settings.py中添加
# SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# SESSION_ENGINE = 'django.contrib.sessions.backends.cache_db'
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
使用redis数据库
安装模块
pip install django-redis
在settings中配置redis
CACHES = {
'default':{
'BACKEND':'django_redis.cache.RedisCache',
'LOCATION':'redis://127.0.0.1:6379/0',
'OPTIONS':{
'CLIENT_CLASS':'django_redis.client.DefaultClient',
}
}
}
设置session
settings中添加 指定使用的库
SESSION_CACHE_ALIAS = 'default'
设置视图函数(views文件)
def setsettion(request):
request.session['name'] = 'aa'
request.session['age'] = '20'
request.session.set_expiry(60) # 设置为0, 浏览器关闭后过期, 设置为None, 则默认2周过期
# 也可在settings中 通过 SESSION_COOKIE_AGE 设置全局默认值
return HttpResponse('session设置完毕')
def getsession(request):
name = request.session.get('name')
age = request.session.get('age')
mobil = request.session.get('mobil','123456789')
print(name, age, mobil)
return Httpresponse('session读取完毕')
删除session
request.session.clesr() # 清除所有session值的部分
request.session.flush() # 清除session数据
del request.session['key'] # 删除session中某个键对应的值
类视图
views中创建类
from django.views import View
class Login(View):
def get(self, request): # 对应 get请求
return render(request, 'index.html')
def post(self, request): # 对应 post请求
return render(request, 'index.html')
urls 中添加路由
from . import views
re_path(r'^login/$', views.Login.as_view())
中间件
相当于装饰器,在视图函数获取请求,服务器发出响应之间
1. 在应用中创建中间件文件
创建文件 mymiddleware.py
def my_middleware(get_response):
print('mymid 调用')
def middleware(request):
print('请求前调用')
response = get_response(request)
print('响应后调用')
return response
return middleware
2. 在settings文件中添加
# 中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'appname.mymiddleware.my_middleware', # 添加的中间件
]
设置模板
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'app01', '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',
],
},
},
]
模板渲染
class Index(View):
def get(self, request):
# 获取模板
template = loader.get_template('home.html')
# 渲染模板
context = {'uname':'zzer'}
data = template.render(context)
# 返回数据
return HttpResponse(data)
简化
class Index(View):
def get(self, request):
return render(request, 'home.html', {'uname': 'zzer2'})
jinja2
注释
单行注释
{# jinja2 注释 #}
多行注释
{% comment %}
{% endcomment %}
html注释
<!-- html注释 -->
字典取值
{{ adict.bj }}
列表取元素
{{ alist.0 }}
for 循环
{% for e in alist %}
<p>{{ forloop.counter }}:{{ e }}</p> {# forloop.counter取值从1开始,表示第几次循环 #}
{% endfor %}
forloop.counter 取值从1开始
if条件
{% if alist.0 == 3 %} {# 条件运算符前后必须有空格 #}
<p>条件1成立</p>
{% elif alist.1 == 3 %}
<p>条件2成立</p>
{% else %}
<p></p>
{% endif %}
过滤器
语法:
变量|过滤器:参数
- safe,禁用转义
- length,长度(len)
- default,设置默认值,当变量不存在时返回默认值
~~~ data|default:'默认值' ~~~ - date,日期,对日期类型的值进行字符串格式化,常用格式化字符串如下
- Y表示年,格式为4位,y表示两位的年
- m表示月,格式01,02,12
- d表示日,格式01,02
- j表示日,格式1,2
- H表示时,24进制,h表示12进制时
- i表示分,为0-59
- s表示秒,为0-59
- value|date:"Y年m月j日 H时i分s秒"