Django一个BLOG实现(参考)(一)

本文指导如何使用Python和Django框架搭建网站,包括准备工作、安装Django、配置数据库、创建应用及模型等步骤,适合初学者快速上手。

最近要做一个网站,语言为python,框架使用Django。

之前由于没接触过python,所以又找了些python的书来看。感觉python的确是门不错的编程语言。

当然,重点还是Django。学习时,我主要参考了官方文档,和一个很简单的BLOG实现。

其实使用Django只需要基础的python知识。所以,大家都去试试吧。

以下为网址:

Django官网: https://www.djangoproject.com/

BLOG实现教程:http://brenelz.com/blog/a-detailed-django-tutorial-blog-basics-part-i/


开始工作

首先是准备工作,你需要在电脑中安装Django,以及一个数据库(这里为了简单,就不介绍了)。

之后,通过输入django-admin.py startproject myblog”来创建一个包含django项目的myblog目录。进入myblog目录后你们会看到以下4个文件:

__init__.py

manage.py

urls.py

setting.py

简单介绍一下这些文件内容:

__init__.py :是用来告诉python这个文件夹的内容是一个可以被其他python package import 或者include 的 package。 这就使得我们的应用程序能被django框架执行。这也是这个文件存在的意义。

manage.py:提供了通过设置settings.py,django-admin.py所能给出的命令。这就使得你能够执行:python manage.py runserver来在服务器上运行你的项目,而不用将你的项目模块添加到python 模块中再设置settings.py文件。

urls.py:描述了服务端urls与函数调用的映射,并最终返回一个http response。URLs都是通过正则表达式来做映射的。

settings.py:包含了项目相关的设置。在其中有为独立应用设置的参数,也有全局参数(例如数据库database和时区timezone信息)

了解了这些后,我们开始进行对settings.py的设置:

首先是数据库,我使用的是mysql,所以如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'myblog_db',                      # Or path to database file if using sqlite3.
        'USER': 'djangouser',                      # Not used with sqlite3.
        'PASSWORD': '123456',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

如果你使用的是别的数据库,那么请自行设定。

有一点值得注意,在settings.py中的文件路径必须是绝对路径。因为相对路径是不清楚的(one of python's philosophies)。但是我们可以通过在settings.py中添加以下代码段来让我们在settings.py中可以使用相对路径。

import os
rel = lambda *x: os.path.join(os.path.abspath(os.path.dirname(__file__)), *x)

代码中第一行import了python提供的os模块,其中包含了路径相关操作。

第二行中我们创建了一个称做rel的lambda/anonymous函数。在python中,lambda函数通常是带返回值的短短一行的函数,而它的返回值是隐式传递的。作为lambda函数定义的一部分,任意多的参数都将被储存于x数组中。

让我们来用一下上面定义的函数来设置TEMPLATE_DIRS:

TEMPLATE_DIRS = (
    rel(‘templates’),
)

这样我们就将TEMPLATE_DIRS与当前项目目录中的templates子目录关联起来了。再次强调,若没有定义rel函数,在settings.py中对文件路径的设置需使用绝对路径。

保存,我们的开始工作就做好了。

创建第一个应用

若一个BLOG没有帖子(posts),还称得上BLOG么?所以我们第一个要做的是一个blog posts的应用。你需要做的是在项目目录中执行:

django-admin.py startapp posts or python manage.py startapp posts

这样就创建了一个叫做posts的子目录以及应用。

进入posts目录你会看到以下文件:

__init__py:作用与项目中的__init__.py一样

models.py:包含了与存储在数据库中数据相关的类,是数据库中数据到python的一个映射。

view.py:包含了项目中urls.py中所映射到的函数。这些函数还是数据库数据与模板的“粘合剂”。

test.py:为应用提供一个用来测试的文件

在开始实现功能之前,我们首先需要为应用添加一些model。我们的帖子模型将会是最精简的。那么,打开models.py文件,添加下列代码:

from django.contrib.auth.models import User
class Post(models.Model):
    author = models.ForeignKey(User, related_name=’posts’)
    title = models.CharField(max_length=200)
    body = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)
    up_date = models.DateTimeField(auto_now=True)
    def __unicode__(self):
        return self.title

补充:‘self’是什么?

Python是一门清晰的语言。所以在类的方法中的开头需要额外添加一个参数作为该类的一个实例。而这个实例通常称做self。这就像$this变量在php或者this在java中的效果一样。

以上的代码展示了我们的从django的Model类中继承的模型中的数据。第一行import了django提供的Usermodel,这样就为我们的项目添加了“用户”支持,其中包括认证与权限。但在这个例子中,我们只需要将用户与帖子的发表者联系起来就行了。称做related_name的关键参数是一个可变的名称,是User模型储存帖子列表。默认为<model_name>_set,但这里我们定义为posts。

每个帖子都会有一个标题(title)字段,在数据库中是一个最大长度为200字符的字段。通过数据库(假设你是用Django来创建表)和Django保存使这个字段生效。内容(body)字段是自解释的,它创建了一个用来保存大量文本字符串的字段。发帖时间(Pub_date)和更新时间(up_date)在数据库中以时间(datetime)字段形式储存。关键字参数auto_now_add设置这些字段在模型被加入到数据库时自动存入当前时期与时间。同样的,一旦模型被保存auto_now就自动提供当前的时间。

最后,我们定义了一个__unicode__方法。这个方法在一个帖子实例被请求自动展示使会被调用返回一个unicode字符串。

这样我们的模型就定义好了~

接下来需要在项目中加上我们自己定义的应用。在settings.py中的INSTALLED_APPS添加posts,结果如下:

INSTALLED_APPS = (
    ’django.contrib.auth’,
    ’django.contrib.contenttypes’,
    ’django.contrib.sites’,
    ’posts’,
)

在应用被装载时,它们是按照上面列出的顺序装载的。所以你自己定义的应用应该放在最后,因为它们依赖于Django内置的应用。

我们能通过python manage.py syncdb命令来告诉Django在数据库中创建INSTALLED_APPS已有模型的表。

这里需要注意一个django syncdb的缺陷:

manage.py syncdb不会做模式迁移。这意味着syncdb只会创建数据库中不存在的表,若该表已存在,django syncdb不会做任何事。这样,在你想对model&table做出一些修改时就会出现问题了。最简单的方法是运行python manage.py reset <appname>来删除并重新创建特定应用的表,但这样你就失去了之前所存的数据。或者,目前有许多django开发者实现的第三方模式迁移的实现,这些值得注意。但到目前,官方没有相关方法。

当创建django.contrib.auth表时,程序会要求你创建一个超级用户,按照程序一直执行下去。之后,会介绍创建管理员界面,并用超级用户登录。


PS:先到这,感觉有些地方值得注意:

1.related_name

2.django syncdb的缺陷




<think>我们使用Django实现一个登录界面,需要以下步骤: ### 1. 创建Django项目和应用 首先创建项目和应用(如果尚未创建): ```bash django-admin startproject myproject cd myproject python manage.py startapp accounts ``` ### 2. 配置用户模型 在`accounts/models.py`中定义用户模型(如果使用自定义用户模型): ```python from django.contrib.auth.models import AbstractUser class User(AbstractUser): # 可添加自定义字段 pass ``` 在`settings.py`中设置: ```python AUTH_USER_MODEL = 'accounts.User' ``` ### 3. 创建登录视图 在`accounts/views.py`中编写登录视图: ```python from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login def login_view(request): error = None if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('home') # 重定向到首页 else: error = "用户名或密码错误" return render(request, 'accounts/login.html', {'error': error}) ``` ### 4. 设计登录模板 在`templates/accounts/login.html`中创建登录表单: ```html <!DOCTYPE html> <html> <head> <title>登录</title> </head> <body> <h2>用户登录</h2> {% if error %} <p style="color: red;">{{ error }}</p> {% endif %} <form method="post"> {% csrf_token %} <div> <label>用户名:</label> <input type="text" name="username" required> </div> <div> <label>密码:</label> <input type="password" name="password" required> </div> <button type="submit">登录</button> </form> </body> </html> ``` ### 5. 配置URL路由 在`accounts/urls.py`中: ```python from django.urls import path from . import views urlpatterns = [ path('login/', views.login_view, name='login'), ] ``` 在项目`urls.py`中包含应用路由: ```python from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('accounts/', include('accounts.urls')), ] ``` ### 6. 运行并测试 启动开发服务器: ```bash python manage.py runserver ``` 访问`http://127.0.0.1:8000/accounts/login/`测试登录功能。 ### 关键点说明 1. **用户认证**:使用`authenticate()`和`login()`函数处理认证[^4] 2. **CSRF保护**:表单必须包含`{% csrf_token %}`标签 3. **错误处理**:返回错误信息到模板 4. **重定向**:登录成功后跳转到指定页面 > 注意:实际项目中应使用Django内置的登录视图(如`LoginView`)以获得更完整的功能[^3]。 §§相关问题§§ 1. 如何在Django登录功能中实现记住我? 2. Django如何集成第三方登录(如微信、GitHub)? 3. 如何为Django登录界面添加验证码功能? 4. Django中如何实现基于JWT的认证? </think> ### 使用 Django 编写登录界面的完整教程 下面是创建一个安全登录界面的分步指南,结合了 Django 内置认证系统和最佳实践: #### 1. 创建项目和基础结构 ```bash # 创建项目 django-admin startproject myproject cd myproject # 创建用户认证应用 python manage.py startapp accounts # 迁移数据库 python manage.py migrate ``` #### 2. 配置用户模型 (`accounts/models.py`) ```python from django.contrib.auth.models import AbstractUser class User(AbstractUser): # 可添加自定义字段 phone = models.CharField(max_length=15, blank=True) ``` 在 `settings.py` 中添加: ```python AUTH_USER_MODEL = 'accounts.User' INSTALLED_APPS = [ ... 'accounts', ] ``` #### 3. 创建登录视图 (`accounts/views.py`) ```python from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login from django.views import View class LoginView(View): def get(self, request): return render(request, 'accounts/login.html') def post(self, request): username = request.POST.get('username') password = request.POST.get('password') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) # 设置session/cookie保持登录状态 request.session['username'] = username return redirect('dashboard') # 重定向到仪表盘 else: error = "用户名或密码错误" return render(request, 'accounts/login.html', {'error': error}) ``` #### 4. 设计登录模板 (`templates/accounts/login.html`) ```html <!DOCTYPE html> <html> <head> <title>用户登录</title> <style> .error { color: red; } .form-group { margin: 15px 0; } </style> </head> <body> <h2>用户登录</h2> {% if error %} <p class="error">{{ error }}</p> {% endif %} <form method="post"> {% csrf_token %} <div class="form-group"> <label>用户名:</label> <input type="text" name="username" required autofocus> </div> <div class="form-group"> <label>密码:</label> <input type="password" name="password" required> </div> <button type="submit">登录</button> </form> <p>还没有账号? <a href="{% url 'register' %}">立即注册</a></p> </body> </html> ``` #### 5. 配置 URL 路由 `accounts/urls.py`: ```python from django.urls import path from .views import LoginView urlpatterns = [ path('login/', LoginView.as_view(), name='login'), ] ``` `myproject/urls.py`: ```python from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('accounts/', include('accounts.urls')), ] ``` #### 6. 创建超级用户 (用于测试) ```bash python manage.py createsuperuser # 按提示输入用户名/邮箱/密码 ``` #### 7. 运行和测试 ```bash python manage.py runserver ``` 访问 `http://127.0.0.1:8000/accounts/login/`,使用创建的超级用户凭证测试登录 #### 8. 安全增强措施 1. **密码加密**:Django 自动使用 PBKDF2 算法加密密码 2. **会话管理**:登录成功后设置 session ```python request.session['user_id'] = user.id # 存储用户ID ``` 3. **登录限制**:添加登录尝试次数限制 4. **HTTPS**:生产环境必须启用 HTTPS #### 9. 扩展功能 1. **"记住我"功能**: ```python if request.POST.get('remember_me'): request.session.set_expiry(1209600) # 两周 ``` 2. **密码重置**:使用 Django 内置的 `PasswordResetView` > 完整代码参考:[Django博客项目()—— 注册和登录页面][^1],[django用Eclipse编写登录界面][^2] ### 常见问题解决 1. **CSRF验证失败**:确保模板中有 `{% csrf_token %}` 2. **用户认证失败**:检查 `authenticate()` 返回结果 3. **静态文件加载问题**:配置 `STATIC_URL` 和 `STATICFILES_DIRS`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值