本篇内容是利用Python语言,创建一个多用户的文章管理系统。
Django入门之用户管理
自定义模板和静态文件位置
一个比较大的系统会创建多个应用,这种情况将模板、静态文件放在统一的某一位置。
一旦修改模板文件位置,应用会找不到关联文件,需要修改mysite/settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR),'templates',], #为跟目录添加关联路径
'APP_DIRS': False,#告诉django不在按照默认路径寻找
'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',
],
},
},
]
现在在根目录里创建文件夹templates,以后根目录的关联路径就在这里了,将原来应用中的templates文件夹中文件转移过去,就可以正常显示了。
同理修改静态文件位置,需要修改mysite/settings.py
在末尾添加代码
STATIC_URL = '/static/'
STATICFILES_DIRS =(
os.path.join(BASE_DIR,"static"),
)
现在在根目录下创static文件夹就可以了。
html使用静态文件,上次是放在服务器上,我们现在将他下载放在static/css文件夹中,只要将原来去第三方服务器的路径改成
现在如果登陆http://127.0.0.1:8000/admin/
浏览器会报错,TemplatesDoesNotExist at/admin,这是为什么呢,因为我们没有将后台管理模板文件放到templates中,所以去djang安装路径C:\Python27\Lib\site-packages\django\contrib\admin\templates
中找到文件夹admin和registration,将他们复制到我们项目的templates中,重启服务器,输入地址,完美运行!
用户登陆
admin是管理员,从后台登陆,其他用户不需要管理后台,那从前台登陆,这又是一个功能,所以创建一个应用。cmd
python manage.py startapp account
添加settings中
Install_apps=[
...
'account',
]
配置项目的url
添加url(r'^account/',include('account.urls',namespace='account',app_name='account')),
在account下创建url
配置应用路径
from diango.con.urls import url
from . import views
from django.conf import settings
urlpatterns=[
url(r'^login/$',views.user_login,name-"user_login"),
]
登陆有小框框啊,叫表单,那就在应用中创建一个forms.py来放表单
from django import forms
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
登陆页面一定要返回数据与数据库进行比较的,现在介绍两个函数
is_bound()用来判定实例是否创建
is_valid() 用来比较实例与表单内容是否一致
两个都是bool型函数
都了解了就开始写函数了account/views.py
中
from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import autheneicate,login
from .forms import LoginForm
def user_login(requsest):
if requsest.method == "POST":
login_form = LoginForm(request.POST)
if login_form.is_valid():
cd = login_form.cleaned_data
user = authenticate(username=cd['username'], password = cd ['password'])
#使用authenticate()方法验证用户名与密码是否匹配
if user:
login(request,user)
return HttpResponse("Welcome you!")
else:
return HttpResponse("Sorry.Your username or password is not right.")
else:
return.HttpResponse("Invalid login")
if request.method == 'GET':
login_form=LoginForm()
return render(request, "account/login.html",{"form":login_form})
顺便提写一下GET与POST的区别
GET多用于数据查询而POST多用于数据写入或许更新
request.GET/POST是当客户端对服务器发出GET/POST请求后得到的类字典对象,如上,就会得到用户名和密码
看以上代码响应跳转到login.html,所以在自定义文件templates中创建account文件夹,并将login.html写入继承base.html,并写入表单csrf_token
必不可少,csrf中文名是跨站请求伪造,就是盗用了用户的身份,一用户名义发送恶意请求,Django内置框架内置CSRF插件,可以免受csrf的攻击。前端使用POST方法提交数据时会被禁止。但POST又必不可少,就是解决办法之一,在表单中任意位置写入与表单一同提交就可以了。
综上login.html就写好了
将他写成给header.html中login键的超链接只需要修改header.html中