django

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'),
]
设置子路由
  1. 在应用目录下创建文件urls.py
from app01 import views
from django.urls import path


urlpatterns = [
    path('mydjango/', views.index),
]


  1. 在项目目录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秒"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值